Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >将浮点数转换为字符串

将浮点数转换为字符串
EN

Code Review用户
提问于 2020-07-21 09:25:26
回答 1查看 158关注 0票数 5

我受到这是马特·帕克的视频的启发,使用Farey序列将浮点数转换为分数的字符串表示,我做得如何?我有多好地遵循了F#工作流和模式(我对这门语言很陌生)?它是否可以做得更好,或者更确切地说,一个“专业”的F#开发人员如何编写这个函数?提前感谢!

代码语言:javascript
运行
AI代码解释
复制
let toFraction num =
  let rec farey n0 d0 n1 d1 =
    let n2 = n0 + n1
    let d2 = d0 + d1

    match (n2 / d2) with
    | x when abs (x - num) < 1e-5 -> string n2 + " / " + string d2
    | x when x < num -> farey n2 d2 n1 d1
    | x when x > num -> farey n0 d0 n2 d2
    | _ -> "" // Compiler detects "incomplete pattern matches on this expression without this wildcard, 
    // maybe this is where my method can be improved?

  farey 0. 1. 1. 1.

此外,此问题假定输入num位于集0 <= num < 1中。

EN

回答 1

Code Review用户

发布于 2020-07-22 01:47:37

关于它本身的函数和算法,没有什么可说的。它是一个普通的递归函数--带有尾调用--对于递归函数来说是最优的。

我发现作为返回值的字符串并不真正有用。相反,我会返回一个由两个整数组成的元组,表示分子和分母。

代码语言:javascript
运行
AI代码解释
复制
let toFraction (num: float): (int * int) = etc...

或者,您可以将受歧视的工会定义为:

代码语言:javascript
运行
AI代码解释
复制
type Fraction = Fraction of int * int

..。用于:

代码语言:javascript
运行
AI代码解释
复制
let toFraction num =
if num <= 0.0 || num >= 1.0 then
    failwith "Invalid input"
else
  let rec farey n0 d0 n1 d1 =
    let n2 = n0 + n1
    let d2 = d0 + d1

    match float n2 / float d2 with
    | x when abs (x - num) < 1e-10 -> Fraction(n2, d2)
    | x when x < num -> farey n2 d2 n1 d1
    | x when x > num -> farey n0 d0 n2 d2
    | _ -> failwith "Something went completely wrong" // just to fulfill the pattern matching - it should never happen

  farey 0 1 1 1

并被称为

代码语言:javascript
运行
AI代码解释
复制
let (Fraction(num, denom)) = toFraction value
printfn "%d / %d" num denom

如图所示,我选择使用整数而不是浮点数来运行farey。您应该测试这是否比使用浮点数更有效。

match (n2 / d2) with

你不需要括号。

num在set 0 <= num < 1

0 = num是一个边缘情况,被错误地计算为

代码语言:javascript
运行
AI代码解释
复制
1 / 100001

如果希望将0包含在域中,则需要使用值-1 0 1 1启动faray。然后它将返回"0 / 1"

即使您在注释中指定,假设num应该介于0到1之间,您也应该防止无效输入,特别是因为无效输入可能导致无限递归循环。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/245822

复制
相关文章
php计算两个日期之间的间隔,避免导出大量数据
在做系统业务功能的时候,有的时候业务人员会进行超大范围地导出excel表格,导致内存、CPU占用飙升。
宣言言言
2019/12/17
2.5K0
css内容 元素 元素空间的练习
<!DOCTYPE html> <html> <head> <title></title> <style type="text/css"> *{padding: 0px;margin: 0px;} .box1 { width: 50px; height: 50px; padding: 25px; background-color: red; } /*这个为元素的宽高都为150px。内容的宽高为100px*/ .box2 { width: 96px
贵哥的编程之路
2020/10/28
1.2K0
LeetCode 2121. 相同元素的间隔之和(前缀和)
arr 中两个元素的 间隔 定义为它们下标之间的 绝对差 。更正式地,arr[i] 和 arr[j] 之间的间隔是 |i - j| 。
Michael阿明
2022/01/07
5990
如何获取数组a和数组b 之间的共元素?
# 4.如何获取数组a = np.array([1,2,3,2,3,4,3,4,5,6])和数组b = np.array([7,2,10,2,7,4,9,4,9,8])之间的共元素? # 法1 a
瑞新
2020/07/07
3.6K0
LeetCode 1360. 日期之间隔几天(闰年判断)
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/number-of-days-between-two-dates 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Michael阿明
2020/07/13
8910
如何快速解决或避免EDI系统磁盘空间不足?
随着企业业务数据量的增大,现有服务器环境可能无法提供足够的磁盘空间存放数据处理的日志和文件,磁盘空间不足是影响EDI环境正常运行的一大原因,会导致数据无法正常处理,日志信息无法写入,影响业务正常进行。本文将为大家介绍出现磁盘空间不足,导致EDI系统运行异常的紧急处理方法。
知行软件EDI
2022/09/06
1.4K0
如何快速解决或避免EDI系统磁盘空间不足?
【Kotlin 协程】Flow 流组合 ( Flow#zip 组合多个流 | 新组合流的元素收集间隔与被组合流元素发射间隔的联系 )
假如两个 Flow 流的 元素发射 不同步 , 则 先发射的元素 , 需要等待对应顺序的 后发射的元素到来 ;
韩曙亮
2023/03/30
1.1K0
【Kotlin 协程】Flow 流组合 ( Flow#zip 组合多个流 | 新组合流的元素收集间隔与被组合流元素发射间隔的联系 )
Java&nbsp;计算计算两个日期之间的间隔…
import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner;
明明如月学长
2021/08/27
2.2K0
清除inline-block元素之间的空白
一个元素如果被设置为display:inline-block,那么这个元素将表现为行内块的性质。被设为行内块的元素 对内(子元素)表现为块级框,具体为可以设置高度宽度,可以设置垂直margin和padding等;对兄弟元素 则表现为行内框,具体表现为相邻行内块可在同一行显示,而且有着行内元素的特点,就是框与框之间可以出现 空白,造成空白的方式可以使“空白符,制表符,换行符”。 可以通过简单的方式消除行内块之间的空白,就是在行内块的包含块上设置属性: .wrapper{font-size: 0;*word-s
欲休
2018/03/15
8940
Java&nbsp;计算计算两个日期之间的间隔…
import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner;
明明如月学长
2021/08/27
1.8K0
【LeetCode第 177 场周赛】5169. 日期之间隔几天
输入:date1 = "2019-06-29", date2 = "2019-06-30" 输出:1 示例 2:
韩旭051
2020/06/23
8970
探秘Oracle表空间、用户、表之间的关系
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/49282199
DannyHoo
2018/09/13
2.8K0
探秘Oracle表空间、用户、表之间的关系
如何避免FOUC
FOUC即无样式内容闪烁也可以称为文档样式短暂失效,主要就是指HTML已加载而样式表并未加载,此后样式表再加载而产生的闪烁现象。
WindRunnerMax
2020/08/27
1.1K0
Python类的空间问题以及类之间的关系
总结:对象的属性不仅可以在init里面添加,还可以在类的其他方法或者类的外面添加。
星陨1357
2023/03/14
8000
如何避免「脸红」
我是一个特别容易脸红的,对于女生来说脸红其实可以当腮红,看起来还超可爱,但是我是一个大男人呢,估计我是一个人见人怕,佛听了都哆嗦,非常在意别人的意见和看法,以及追求点小完美的处女座吧。
叉叉敌
2019/02/23
1.3K0
如何避免「脸红」
PHP 命名空间元素访问及use的使用
使用 as 时空间元素名称则被新名称取代, 原名称不能用了, 故不能称之为起别名, 应该是起新名
很酷的站长
2023/01/05
1.3K0
PHP 命名空间元素访问及use的使用
Redis内存空间占用及避免数据丢失的方法
在现代的互联网应用中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、会话管理和消息队列等场景。然而,Redis的内存资源是有限的,过多的内存占用可能会导致数据丢失。因此,对于项目中使用Redis的架构师来说,合理预估Redis内存空间的占用,并采取相应的措施来避免内存占用过多,是非常重要的。
疯狂的KK
2023/08/22
5030
Redis内存空间占用及避免数据丢失的方法
点击加载更多

相似问题

如何选择间隔之间的元素

11

内容:在第一项和最后一项之间有相等空间的间隔。

510

避免减号和金额之间的行间隔。

21

元素之间的空间

12

删除html元素之间的自动间隔/行间隔?

33
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档