2013-03-24 3 views
2

У меня странная проблема. Я пытаюсь сохранить результат уравнения в двойную переменную.Weird Java математическое исполнение

double s = (((100 + 1)*(1/3))/100 + (1/3)); 

Это возвращает значение a 0, а не 0,67 (правильное значение, рассчитанное калькулятором). Любая причина, почему это может произойти?

Примечание: Решение о том, что я мог бы просто сделать s = 0,67 не является решением,

Спасибо заранее.

+1

Если вы добавляете 'd' в конце концов ваши номера, например '100d', вы будете использовать операции с плавающей запятой, а не целые операционные системы. – jedwards

+0

Как уже было сказано, я просто добавляю примечание, что если вам нужно точное значение '0.67', в отличие от' 0.669999999999', вы должны использовать 'BigDecimal'. http://stackoverflow.com/questions/322749/retain-precision-with-doubles-in-java – gaganbm

ответ

8

следующее использует целое (т.е. срезающий) деление, результат которого равен нуль:

1/3 

Чтобы получить деление с плавающей точкой, либо превратить аргумент в двойном, например,

1.0/3 

Таким образом, общее выражение становится:

double s = (((100 + 1)*(1./3))/100 + (1./3)); 

1. такое же, как 1.0. Другими способами выражения такого же числа, как double, являются 1d и 1D.

Вышеприведенное выражение оценивается как 0.6699999999999999.

+0

Да, я не знаю, как я допускаю этот промах. Спасибо. Это довольно долго меня раздражало. –

3

Компилятор видит ваши numers как Int .. В

попробовать, как это:

double s = (((100d + 1d)*(1d/3d))/100d + (1d/3d)); 

теперь результат будет:

0,6699999999999999

Смежные вопросы