我的输出是这样的-
ruby-1.9.2-p290 :011 > 2.32 * 3 => 6.959999999999999
我记得有一次我在另一台机器上得到了它。. 2.32 * 3 = 6我错在哪里?非常感谢你阅读这篇文章。:)
2.32 * 3 = 6
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。
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:
BigDecimal
System.out.println(new BigDecimal(2.32)); 2.319999999999999840127884453977458178997039794921875
你在这里看到的是2.32的实际含义。只是在大多数情况下,print或toString(),或任何用于将浮点数转换为字符串的语言,都会对数字进行一点舍入。不精确的值,因为浮点数实际上是二进制表示的实数,而不是十进制的,这反过来又使那些二进制 * 重复,* 或循环。正如你所猜测的,在有限的空间里重复真实的永远不会精确。实际上,当我说上面可怕的小数是2.32的意思时,我在撒谎-正确的措辞是,“这是Java可以获得的最接近2.32实际值的小数”。阅读更多:http://floating-point-gui.de/
2.32
print
toString()
evrscar23#
你的问题只是Float s不精确:http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems这并不是真正的语言特定。
Float
wz8daaqr4#
只需使用.to_d将Float转换为BigDecimal即可解决您的精度问题
.to_d
(2.32.to_d * 3.to_d).to_f => 6.96
4条答案
按热度按时间svgewumm1#
如果你真的想四舍五入到一个整数
但我觉得不太可能通常你只想把稍微不精确的浮点数格式化成这样的格式
如果你真的想使用精确的表示,那么你可以使用BigDecimal。
PS.推荐阅读http://floating-point-gui.de/ DS。
i86rm4rw2#
我不能告诉你关于鲁比的事,所以请原谅我。但坦率地说,原则保持不变,所以我希望这会有所帮助:
正如你所看到的,Python也是这样做的。
Java也是一样!有什么问题吗?
让我们尝试移动到
BigDecimal
s:你在这里看到的是
2.32
的实际含义。只是在大多数情况下,print
或toString()
,或任何用于将浮点数转换为字符串的语言,都会对数字进行一点舍入。不精确的值,因为浮点数实际上是二进制表示的实数,而不是十进制的,这反过来又使那些二进制 * 重复,* 或循环。正如你所猜测的,在有限的空间里重复真实的永远不会精确。
实际上,当我说上面可怕的小数是
2.32
的意思时,我在撒谎-正确的措辞是,“这是Java可以获得的最接近2.32
实际值的小数”。阅读更多:http://floating-point-gui.de/
evrscar23#
你的问题只是
Float
s不精确:http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems
这并不是真正的语言特定。
wz8daaqr4#
只需使用
.to_d
将Float
转换为BigDecimal
即可解决您的精度问题