2013-12-04 3 views
-3

Вот извлеченный код:ява давая .9999999 вместо закругленной целого числа

long timeMs = 1473; 
double timeS = (timeMs/1000) + (timeMs% 1000)/1000.0; 
System.out.println(timeS); 

И выход:

1.4729999999999999 

Так в основном, я просто пытался преобразовать время, затрачиваемое в секундах в миллисекундах. После того, как я увидел это, я думал, что мой метод неправильный, поэтому я пробовал другие входы, такие как 1472, 1474, 1173, 3 и т. Д., Которые дали правильные значения (1.472, 1.474, 1.173, 0.003).

Я думаю, что я натолкнулся на нечто похожее на это некоторое время назад в книге под названием Java Puzzlers, но забыл. Может ли кто-нибудь сказать мне, почему это происходит (и правильный термин/ошибка)?

Спасибо.

+0

Точка плавающей точки. –

+0

-1 с плавающей запятой .. Google it. –

+3

Прочитайте [Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) – Reimeus

ответ

3

Используйте это вместо этого, но это из-за IEEE 754 правил округления.

double timeS = (timeMs/1000.0); //+ ((double) (timeMs % 1000)/1000.0); 
0

Использование BigDecimal для более точного округления и масштабирования.

long timeMs = 1473; 
    double timeS = (timeMs/1000d); 
    BigDecimal usefulName = new BigDecimal(timeS).setScale(3, RoundingMode.HALF_UP); 
    System.out.println(usefulName); 
Смежные вопросы