Ruby -乘法问题

ffvjumwh  于 2023-04-29  发布在  Ruby
关注(0)|答案(4)|浏览(122)

我的输出是这样的-

ruby-1.9.2-p290 :011 > 2.32 * 3
=> 6.959999999999999

我记得有一次我在另一台机器上得到了它。. 2.32 * 3 = 6
我错在哪里?非常感谢你阅读这篇文章。:)

svgewumm

svgewumm1#

如果你真的想四舍五入到一个整数

(3 * 2.32).to_i

但我觉得不太可能通常你只想把稍微不精确的浮点数格式化成这样的格式

"%0.2f" % (3 * 2.32) 
=> "6.96"

如果你真的想使用精确的表示,那么你可以使用BigDecimal

require 'BigDecimal'
(3 * BigDecimal.new("2.32")).to_s("F")
=> "6.96"

PS.推荐阅读http://floating-point-gui.de/ DS。

i86rm4rw

i86rm4rw2#

我不能告诉你关于鲁比的事,所以请原谅我。但坦率地说,原则保持不变,所以我希望这会有所帮助:

Python 2.7.1 (r271:86832, Jun 16 2011, 16:59:05) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 2.32 * 3
6.959999999999999

正如你所看到的,Python也是这样做的。

System.out.println(2.32 * 3);
6.959999999999999

Java也是一样!有什么问题吗?
让我们尝试移动到BigDecimal s:

System.out.println(new BigDecimal(2.32));
2.319999999999999840127884453977458178997039794921875

你在这里看到的是2.32的实际含义。只是在大多数情况下,printtoString(),或任何用于将浮点数转换为字符串的语言,都会对数字进行一点舍入。
不精确的值,因为浮点数实际上是二进制表示的实数,而不是十进制的,这反过来又使那些二进制 * 重复,* 或循环。正如你所猜测的,在有限的空间里重复真实的永远不会精确。
实际上,当我说上面可怕的小数是2.32的意思时,我在撒谎-正确的措辞是,“这是Java可以获得的最接近2.32实际值的小数”。
阅读更多:http://floating-point-gui.de/

evrscar2

evrscar23#

你的问题只是Float s不精确:
http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems
这并不是真正的语言特定。

wz8daaqr

wz8daaqr4#

只需使用.to_dFloat转换为BigDecimal即可解决您的精度问题

(2.32.to_d * 3.to_d).to_f
=> 6.96

相关问题