Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.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中的算术_Ruby_Math_Floating Point_Ieee 754 - Fatal编程技术网

ruby中的算术

ruby中的算术,ruby,math,floating-point,ieee-754,Ruby,Math,Floating Point,Ieee 754,为什么ruby中的代码7.30-7.20返回0.099999996,而不是0.10 但是如果我写7.30-7.16,例如,一切都会好的,我会得到0.14 问题是什么?我该如何解决它?这是一个常见的错误,因为浮点数字在内存中是如何表示的 如果需要精确的结果,请使用BigDecimal result=BigDecimal.new("7.3")-BigDecimal("7.2") puts "%2.2f" % result 问题是。您可以使用Rational、BigDecimal或纯整数来解决这个问

为什么ruby中的代码
7.30-7.20
返回
0.099999996
,而不是
0.10

但是如果我写
7.30-7.16
,例如,一切都会好的,我会得到
0.14


问题是什么?我该如何解决它?

这是一个常见的错误,因为浮点数字在内存中是如何表示的

如果需要精确的结果,请使用BigDecimal

result=BigDecimal.new("7.3")-BigDecimal("7.2")
puts "%2.2f" % result
问题是。您可以使用Rational、BigDecimal或纯整数来解决这个问题(例如,如果您想存储货币,您可以将美分数存储为int,而不是将美元数存储为float)

BigDecimal可以准确地存储任何以10为基数有有限位数的数字和不以10为基数的整数(因此三分之三不是一个整数)


Rational可以准确地存储任何有理数,但根本不能存储无理数。

由于您正在进行浮点运算,因此返回的数字是计算机用于精确计算的数字

如果您想要一个更接近的答案,以设定的精度,只需将浮点数乘以该值(例如乘以100),将其转换为整数,进行数学运算,然后除以

还有其他解决方案,但我发现这是最简单的,因为四舍五入对我来说总是有点不确定

这是之前提出的问题,您可能希望查找之前给出的一些答案,例如:
问题在于,我们可以轻松地用十进制书写的一些数字,在当前硬件实现的特定浮点格式中没有精确的表示形式。一种不经意的说法是,所有整数都有,但不是所有分数都有,因为我们通常用
2**e
指数存储分数。因此,您有3种选择:

  • 适当地四舍五入。未经舍入的结果总是非常接近,因此舍入的结果总是“完美的”。这就是Javascript所做的,很多人甚至没有意识到JS是用浮点完成所有事情的

  • 使用定点算法。Ruby实际上让这变得非常简单;随着数字越来越大,它是唯一可以从Fixnum无缝地转换到Bignum类的语言之一

  • 使用设计用于解决此问题的类,如
    BigDecimal


  • 为了更详细地研究这个问题,我们可以尝试用二进制表示您的“7.3”。第七部分很简单,但是我们该怎么做呢?111.1是7.5,太大了,111.01是7.25,越来越近了。事实证明,111.010011是“下一个最接近的较小的数字”,7.296875,当我们试图填写缺失的.003125时,最终我们发现它只是111.010011001110011。。。永远,在我们选择的有限位字符串编码中不可表示。

    有趣的是,一个基数中只有少量小数的数字在另一个基数中可能通常有大量小数。例如,以10为基数表示1/3(=0.3333…)需要无穷多的小数,但以3为基数仅表示一个小数。类似地,表示基数2中的数字1/10(=0.1)需要许多小数。

    请注意,如果数字在基数10.5中的位数有限,则BigDecimal只能产生精确的结果。不管使用哪种语言,这都是正确的——Java、Ruby、C#都会因此而“受苦”。这是由于二进制逻辑的选择和我们表示浮点数的方式。