3

我有一个处理一些数据的 Rails 应用程序,其中一些数据包括带小数的数字,例如1.9943,以及这些数字与其他整数之间的除法。我想知道存储它的最佳方式是什么。

我想将保留整数的数字存储为整数,将可能变成小数的数字存储为小数。虽然它是一种奇怪的格式,比如

#<BigDecimal:7fda470aa9f0,'0.197757E1',18(18)> 

当我将两个十进制数或一个小数除以一个整数时,它似乎执行了正确的算术运算。当我尝试用整数除整数时,它不能正常工作。我认为 rails 会自动将结果转换为适当的小数,但它似乎将其保留为整数并去除余数。对此我能做些什么吗?

存储此类信息的最佳方式是什么?我应该将其全部存储为小数,还是浮点数?

4

2 回答 2

4

如果要在不丢失精度的情况下将两个整数相除,则需要将其中一个整数转换为 aFloatBigDecimal第一个:

irb(main):007:0> 2/3
=> 0
irb(main):008:0> Float(2)/3
=> 0.666666666666667

当您说将浮点数/整数与整数/浮点数相除时会得到不同的结果时,我有点困惑?这些应该具有相同的结果:

irb(main):010:0> Integer(2)/Float(3)
=> 0.666666666666667
irb(main):011:0> Float(2)/Integer(3)
=> 0.666666666666667
irb(main):012:0> String( BigDecimal('2')/3 )
=> "0.666666666666666666666666666666666666666666666666666667E0"
irb(main):013:0> String( 2/BigDecimal('3') )
=> "0.666666666666666666666666666666666666666666666666666667E0"

你能提供一个代码示例吗?

就存储而言,任何整数数据都应存储为,Integer无论其在未来计算中的预期用途如何。

存储浮点数与 BigDecimals 取决于您需要多少精度。如果您不需要太多精度, aFloat将提供双精度表示。如果需要高精度,BigDecimal将提供任意精度表示。

相关: Ruby Numbers - 解释整数、浮点数、BigDecimals 和 Rationals 之间的区别

于 2013-09-10T21:24:26.023 回答
-1

你不需要很高的精度来解决浮点数问题你应该尽可能避免使用浮点数。例如:123.6 - 123 => 在浮点数中它会给你 0,59.. 在 BigDecimal 中你将有 0.6

于 2021-10-30T14:08:22.970 回答