2013-09-10 5 views
2

У меня есть приложение rails, обрабатывающее некоторые данные, и некоторые из этих данных включают числа с десятичными знаками, такими как 1.9943, и деление между этими числами и другими целыми числами. Я хотел знать, что лучший способ сохранить это.Поплавки, десятичные числа или целые числа

Я думал о хранении чисел, которые сохраняли бы целые числа в виде целых чисел и чисел, которые могли бы стать десятичными знаками в виде десятичных знаков. Хотя это было в странном формате, как

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

, кажется, выполнить правильную арифметику, когда я разделить два десятичных чисел или десятичную с целым числом. Когда я пытаюсь разделить целые числа с целыми числами, он работает неправильно. Я думал, что рельсы автоматически преобразуют результат в правильное десятичное число, но, похоже, сохраняют его как целое и разделяют остатки. Есть ли что-нибудь, что я могу сделать по этому поводу?

И какой был бы лучший способ хранить этот тип информации? Должен ли я хранить все в виде десятичных знаков или, может быть, плавать?

ответ

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 независимо от ожидаемого использования в будущих расчетах.

Хранение поплавков против BigDecimals зависит от того, какая точность вам требуется. Если вам не требуется большая точность, то Float обеспечит представление с двойной точностью. Если вам требуется высокая степень точности, BigDecimal обеспечит произвольное представление точности.

Связанные:Ruby Numbers - объясняет разницу между Целым, поплавки, BigDecimals и Rationals

+0

К сожалению, я сделал ошибку. Целые числа/Десятичные работы отлично – user2158382

+0

Это работает, за исключением того, что я использовал BigDecimal вместо float. Не могли бы вы рассказать мне, почему я должен использовать float? – user2158382

+0

@ user2158382 BigDecimal используется, когда вам требуется произвольно точное представление. Float используется, когда достаточно представления с двойной точностью. – dbyrne

Смежные вопросы