Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/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 红宝石圆形。5不正确_Ruby - Fatal编程技术网

Ruby 红宝石圆形。5不正确

Ruby 红宝石圆形。5不正确,ruby,Ruby,给我带来麻烦的是: irb> (0.5).round # => 1 YES irb> (0.075).round(2) # => 0.08 YES irb> (9.075).round(2) # => 9.07 WHY??? 发生了什么事?为什么结果不是9.08呢?这必须处理ruby处理浮点的方式。如果您转换为Rational,它将四舍五入到最接近的数字:0.075.to_r.round2=>7/100和9.075.to_r.round2=>907/100

给我带来麻烦的是:

irb> (0.5).round # => 1 YES
irb> (0.075).round(2) # => 0.08 YES
irb> (9.075).round(2) # => 9.07 WHY???

发生了什么事?为什么结果不是9.08呢?

这必须处理ruby处理浮点的方式。如果您转换为Rational,它将四舍五入到最接近的数字:0.075.to_r.round2=>7/100和9.075.to_r.round2=>907/100


关于用于内部存储浮点数的浮点逻辑的更多详细信息:

浮点很棘手。十进制9.075不能精确地表示为浮点。这不是ruby特有的


在大多数情况下,舍入算法不包括NAN等,其工作原理是将数字乘以适当的10次幂,舍入,然后除以相同的数字。乘以10会导致精度损失

浮点数不能精确地表示所有数字。我建议你读书

由于Ruby 2.2,您可以使用和来查看哪些是给定数字的克隆可表示浮点:

9.075.prev_float
#=> 9.074999999999998

9.075.next_float
#=> 9.075000000000001

如您所见,9.075介于9.075000000000001和9.07499999999998之间,因此平均值为9.074999995,因此9.075向下舍入到9.07。

或sprintf'.50f',9.075您能解释为什么0.075被舍入到0.08吗?它的浮点值也略低于十进制值。的文档中的C代码Freddy&@Stefan包含一条扩展注释,这条注释在这里可能会有所帮助。@CarySwoveland很好,但该注释相当技术性。必须有人用外行的语言解释这个算法。有志愿者吗-@AugustinRiedinger BigDecimal9.075.to_.s.round2.to_.f应该可以工作,但更像是一个黑客。也许你应该首先使用BigDecimal并避免浮点数。到Rational的转换已经是有损的,即0.075.to_r不等于75/1000r。这不能解释0.075。其上一次浮点值和下一次浮点值分别为0.07499999998和0.07500000000000001。平均值为0.074999999995,但四舍五入为0.08