Почему десятичные дроби не складываются правильно? - PullRequest
0 голосов
/ 24 февраля 2012

Я работаю над программой, в которой вы можете выбрать до 3 вещей, которые вы хотите разделить между собой.

Скажем, например, что действие приносит вам 4 балла, и эти 4 балла делятся между3 вещи, которые вы выбрали.

В этом случае эти 3 вещи получают 1.33333 ... очков.

В моей базе данных они хранятся как 1.33.

Однако, когдаЯ выношу их, оно достигает 3,99.

Понятно.

Но как я могу избежать этого, не давая одной из вещей 1,34 балла?

Ответы [ 3 ]

5 голосов
/ 24 февраля 2012

Храните полное число с плавающей запятой / двойной в вашей базе данных, а не обрезать до 2 десятичных знаков.Время для усечения - при отображении значения пользователю - , но только усечение отображаемой строки, а не фактическое значение .

Значения с плавающей запятой - раздражающий пьяный дядя вычислений.Просто позвольте им быть такими, какие они есть, а затем очистите их, представив на всеобщее обозрение.

2 голосов
/ 24 февраля 2012

Числа с плавающей запятой в этом случае будут с потерями. Если вы имеете дело с целыми числами и знаменателями, почему бы не сохранить числа в виде дробей? Вы можете использовать библиотеку Pear's Math Fraction или написать что-то самостоятельно.

0 голосов
/ 24 февраля 2012

Используйте третье десятичное число - не для отображения, а только для точности отслеживания. Если кто-то делит 4 балла между тремя, сохраните его как 1.333. Когда вы вычисляете обратно, вы получаете 3.999, который вы округляете до 4. С другой стороны, если кто-то делит 3.99 между тремя объектами, сохраните его как 1.33, поэтому, когда вы вычисляете обратно, вы получите 3.99 (а не 3.999) и, таким образом, вы знать не округлять.

...