Я работаю над программой, в которой вы можете выбрать до 3 предметов, которые вы хотите разделить между пунктами.
Скажем, например, что действие набирает у вас 4 балла, и эти 4 точки разворачиваются среди 3 выбранных вами вещей.
В этом случае эти 3 вещи получат 1.33333 … балла.
В моей базе данных они хранятся как 1.33.
Однако, когда я вывожу их, он достигает 3,99.
Понятный.
Но как я могу избежать этого, не давая одной вещи 1,34 балла?
Храните полный float / double в своей базе данных, а не сокращайте до двух знаков после запятой. Время для trunc – это отображение значения пользователю – но только trunc отображаемая строка, а не фактическое значение .
Значения с плавающей точкой – раздражающий пьяный дядя вычислений. Просто дайте им быть такими, какие они есть, а затем очистите их, когда они предстают перед глазом.
В этом случае числа с плавающей точкой будут убыточными. Если вы имеете дело с целочисленными числителями и знаменателями, почему бы не сохранить числа в виде дробей? Вы можете использовать библиотеку Math Fraction Pear или написать что-то самостоятельно.
Используйте третье десятичное место – не для отображения, а только для отслеживания точности. Если кто-то делит 4 очка среди трех, сохраните его как 1.333. Когда вы вычисляете назад, вы получаете 3.999, на котором вы округляете до 4. С другой стороны, если кто-то делит 3.99 среди трех объектов, сохраните его как 1.33, поэтому, когда вы вычисляете назад, вы получаете 3.99 (а не 3.999), и, таким образом, вы знать не округлять.