2013-09-10 72 views
2

我有一个Rails应用程序处理一些数据,其中一些数据包括带小数的数字,如1.9943,以及这些数字和其他整数之间的分界。我想知道存储这个最好的方法是什么。浮点数,小数或整数

我想存储的数字,将保留整数作为整数和数字,可能成为十进制小数。虽然这是一个奇怪的格式一样

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

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

什么是最好的方式来存储这种类型的信息?我应该将它全部存储为小数,还是浮点数?

回答

3

如果你想不损失精度来划分两个整数,你需要投下他们的一至FloatBigDecimal第一:

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,而不管它在将来的计算中的预期用途。

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

相关:Ruby Numbers - 解释整数之间的差异,浮标,BigDecimals的,而有理数

+0

抱歉,我犯了一个错误。整数/十进制工作正常 – user2158382

+0

这工作除了我用BigDecimal而不是浮动。你能告诉我为什么我应该使用float吗? – user2158382

+0

@ user2158382当您需要任意精确的表示时,使用BigDecimal。当双精度表达式足够时使用浮点数。 – dbyrne