Java - Округление до двух десятичных знаков на основе третьего десятичного значения [дубликат]
Dec 16 2020
Я сижу на этом целый день и думаю как ученик 5-го класса.
public class Tester
{
static String actualValue = "";
private static DecimalFormat df2 = new DecimalFormat("#.##"); //To round off to two decimal places.
static double regPrice = 0.0;
static double regPrice2 = 0.0;
public static void main(String[] args)
{
regPrice2 = 1506.365;
System.out.println("reg price 1 is: "+regPrice2);
System.out.println("reg price 1 after rounding is is: "+round(regPrice2));
regPrice = 8535.765;
System.out.println("reg price is: "+regPrice);
System.out.println("reg price after rounding is: "+round(regPrice));
}
public static double round(double value)
{
df2.setRoundingMode(RoundingMode.HALF_UP);
String returnValue = df2.format(value);
double actualValue = Double.parseDouble(returnValue);
return actualValue;
}
}
Вывод | Значение 1 | Значение 2 |
---|---|---|
Фактический | 1506,37 | 8535. 76 |
Ожидается | 1506,37 | 8535. 77 |
Почему для первого числа работает округление, а для второго - нет? Как я могу заставить это работать?
Ответы
1 TomášZáluský Dec 16 2020 at 07:51
Благодаря представлению с плавающей запятой, то, что вы думаете, 1506.365 или 8535.765 на самом деле немного больше или меньше, чем вы ожидаете. Числа с плавающей запятой представлены в виде мантиссы и экспоненты. Следовательно, например, для 0,365 и 0,765 округление выполняется по-разному. Округление близких половинок происходит в случайном направлении. Используйте, BigDecimal
если вам нужно точное число.