Я просмотрел большое количество вопросов и ответов около math.round /.floor/.truncate/.ceiling
, но не смог найти ответ на мою проблему rounding (with currency values)
.Как убедиться, что округление числа с плавающей запятой выполняется только в первой дополнительной десятичной позиции?
Я понимаю math.round/toeven/awayfromzero
, но это не похоже на это.
(в приведенных ниже примерах 1.88
просто любое число ап может быть заменен любым другим значением n.mm
)
Если результат расчета "decimal/decimal"
является 1.88499
мне нужно 1.88
как закругленным результата. Если расчет дает 1.885499
, я хочу 1,89 в результате rounding (always rounding to two decimal digits)
.
Теперь math.round(1.88499999,2)
Возвращает 1.89
хотя 0.00499999
конечно НИЖЕ посередине между 8
и 9
. Я понимаю, что если число округляется с последними десятичными цифрами до первого, результат понятен:
1.88499999 -> 1.8849999 -> 1.884999 -> 1.88499 -> 1.8849 -> 1.885 -> 1.89
Однако с финансовой точки зрения, как для расчетов по НДС, что не помогает вообще.
Единственный способ, который я могу придумать, - это сократить число сначала за третьей десятичной цифрой, чтобы округлить его до 2 обязательных цифр. Но разве нет более элегантного способа?
Math.Round (1.88499999,2) возвращает 1,88 – dotctor
Как правило, вы не должны использовать float или double для любых вычислений, связанных с деньгами на любом языке программирования (из-за способа float и double work, они являются неточными), есть библиотеки, специально предназначенные для обработки такой операции. попробуйте найти их. Вам нужна библиотека с фиксированной точкой арифметики (которая имеет функции для обработки валюты) – x4rf41
Вы случайно используете float? что объясняло бы, почему '1.88499999' округляет до 1.89' – x4rf41