Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby round()是对一些数字进行舍入,而不是对其他数字进行舍入_Ruby_Floating Point - Fatal编程技术网

Ruby round()是对一些数字进行舍入,而不是对其他数字进行舍入

Ruby round()是对一些数字进行舍入,而不是对其他数字进行舍入,ruby,floating-point,Ruby,Floating Point,我想保留两个小数点。我有这样的数字: 9.96999.to_f.round(2) 大多数情况下,它们被四舍五入到两个小数点(9.97),但偶尔我会得到一个类似于: 9.96999999999 你知道为什么吗 编辑 我正在从一个刮表中添加两个值。查看表格,发生这种情况的唯一时间是当单元格1的值为9.02且单元格2的值为0.95,或者当单元格1的值为9.87且单元格2的值为0.1时。这两次我都应该得到9.97。相反,我得到的正是9.96999999999。所有初始值都以字符串开头。这可能是系统处

我想保留两个小数点。我有这样的数字:

9.96999.to_f.round(2)
大多数情况下,它们被四舍五入到两个小数点(
9.97
),但偶尔我会得到一个类似于:

9.96999999999
你知道为什么吗

编辑


我正在从一个刮表中添加两个值。查看表格,发生这种情况的唯一时间是当单元格1的值为
9.02
且单元格2的值为
0.95
,或者当单元格1的值为
9.87
且单元格2的值为
0.1
时。这两次我都应该得到
9.97
。相反,我得到的正是
9.96999999999
。所有初始值都以字符串开头。

这可能是系统处理浮点的方式,而不是Ruby。举个例子,在IRB中试试这个

10 - 8.2 - 1.8 #=> don't expect zero here
10 - (8.2 - 1.8) #=> same as above with a different result
不要使用.to_f.round() 使用以下命令: A.圆形(2)->整数


将A舍入到最接近的整数。(就这么简单)

浮点值本质上是不精确的。许多精确的小数没有精确的表示法。即使如此,如果您根据计算结果而不是输入来执行,您的回合将运行得更好

最有可能的情况是,您根本不想要圆形,而只是想要控制演示,在这种情况下,使用或


看来您对浮点表示法和算术有一些基本的误解。我建议你在遇到麻烦之前仔细阅读一下。从这里开始:

我尝试了1000次,每次都得到了
9.97
:请给出两种情况的清晰示例。ie:代码和值,其中一个值被四舍五入到小数点后2位,但相同的代码和不同的值却不能。只需编辑更多细节。而不是单独四舍五入,只需将总和四舍五入即可<代码>(9.87+0.1)。第(2)轮@HungryCoder,有效。但是,我刚刚注意到,当字符串开始时类似于
8
,而第二个单元格没有值时,我会以
8.0
结束。是否要在浮动时强制第二个
0
?对于第一个,我得到
6.661338147750939e-16
。对于第二个,我得到了
3.600000000000005
。不过我需要两个小数位。然后将所有内容乘以100,或者使用一个数字。根据定义,浮点数是不精确的。
pry(main)> f = (9.02 + 0.95)
=> 9.969999999999999
pry(main)> '%.2f' % f
=> "9.97"
pry(main)> 9.02.round(2) + 0.95.round(2)
=> 9.969999999999999
pry(main)> f.round(2)
=> 9.97