Различные результаты получаются при округлении десятичных дробей - PullRequest
3 голосов
/ 19 мая 2011
double radius = 5;
double area = Math.PI * Math.pow(radius, 2);            
// System.out.println(area);

BigDecimal bd = new BigDecimal(area).setScale(2, HALF_UP);
// BigDecimal bd = new BigDecimal(area).setScale(2, ROUND_HALF_UP);
System.out.println(bd.toString());

Приведенный выше вывод печатается как 78,54, но если я выполняю ту же операцию через калькулятор (интерфейс Windows Calc), вывод получается как 78,57 (т.е. 22/7 * 25).

Почемутам несоответствие

Ответы [ 3 ]

20 голосов
/ 19 мая 2011

Используете ли вы 22/7 в качестве приблизительного значения для PI? Потому что 22/7 равно 3.142857142857..., где PI составляет приблизительно 3.14159.... Это объясняет ваши несоответствия округления.

Приближение PI, которое используется в JVM, задокументировано здесь . Согласно JavaDoc , это:

Значение double , которое ближе, чем любое другое значение к pi

6 голосов
/ 19 мая 2011

22/7 является приближением к PI, это не точно и поэтому результат

1 голос
/ 19 мая 2011

Почти полностью не по теме (и его JavaScript).Но это все еще забавный ответ для того, чтобы действительно увидеть, как вычисляется ПИ.

Этот метод явно супер-супер-медленный при расчете ПИ ... но на него интересно смотреть.

(function (t) {
    (function () {
        var a = 0,
            b = 1,
            d = 4,
            c = ~1e9;
        (function p() {
            if (!t) {
                return;
            }
            b -= 2;
            a -= d / b;
            d = -d;
            if (++c % 2000 === 0) {
                t.innerHTML = a;
                setTimeout(p, 13);
            } else {
                if (c) {
                    p();
                } else {
                    t.innerHTML = a;
                }
            }
        }());
    }());
}(document.getElementById("someplace-to-hold-the-calculation")))

Филипп Лейберт создал для него JSBin .

...