我有一个处理一些数据的rails应用程序,其中一些数据包括带有小数的数字,例如1.9943
,以及这些数字和其他整数之间的区分。我想知道最好的存储方式是什么。
我想到存储将整数保留为整数的数字和可能成为小数的小数的数字。虽然它是一种奇怪的格式,如
#<BigDecimal:7fda470aa9f0,'0.197757E1',18(18)>
当我将两个十进制数或十进制数除以整数时,似乎执行正确的算术运算。当我尝试用整数划分整数时,它无法正常工作。我认为rails会自动将结果转换为正确的小数,但它似乎保持整数并剥离余数。我能做些什么吗?
存储此类信息的最佳方式是什么?我应该将它全部存储为小数,还是浮点数?
答案 0 :(得分:3)
如果要在不丢失精度的情况下划分两个整数,则需要先将其中一个转换为Float
或BigDecimal
:
irb(main):007:0> 2/3
=> 0
irb(main):008:0> Float(2)/3
=> 0.666666666666667
当你说Float / Integer与Integer / Float划分时你会得到不同的结果时,我有点困惑?这些应该有相同的结果:
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
,无论其在未来计算中的预期用途如何。
存储Floats与BigDecimals取决于您需要多少精度。如果您不需要太多精度,Float
将提供双精度表示。如果您需要高精度,BigDecimal
将提供任意精度表示。
相关: Ruby Numbers - 解释Integers,Floats,BigDecimals和Rationals之间的区别