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