2013-03-07 2 views
0

У меня есть этот код Java для вычисления sin (360):Синус 360 градусов выходит ненулевая

if(re.equals(" sin ")) 
{ 
    try{ 
     String next=data.get(i+1); 
     v1 = Double.parseDouble(next); 
     double degreess = v1; 
     double radianss = Math.toRadians(degreess); 

     BigDecimal bDecimal1 = new BigDecimal(
      Math.sin(radianss), MathContext.DECIMAL32); 

     re=""+bDecimal1; 
     //re=""+Math.sin(Math.toRadians(Double.valueOf(next))); 
     i++; 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

я ожидаю sin(360) должна быть точно 0.

Но мой результат не равен нулю: -0.0000000000000002449294. Почему это не ноль?

+2

http://stackoverflow.com/questions/3961900/java-strange-behavior-with-sin-and-toradians HTTP: // stackoverflow.com/questions/6566512/getting-value-of-sine-180-as-1-22465e-16 –

ответ

0

Вы всегда можете использовать десятичную формат:

DecimalFormat format = new DecimalFormat(); 
format.setMaximumFractionDigits(2); 
System.out.println(format.format(bDecimal1)); 
+0

Зачем это делать? Совершенно верно использовать форматтер для быстрого округления до нужных десятичных знаков. – vikingsteve

4

При работе со значениями с плавающей запятой вы должны использовать abs(sin360 - 0) < delta (где дельта довольно маленькая, как 0,0000001), а не sin360 == 0. Это проблема внутреннего представления с плавающей запятой. What Every Computer Scientist Should Know About Floating-Point Arithmetic

+0

Почему вы рекомендуете оценивать это сравнение? Код в вопросе не содержит никакого сравнения с плавающей запятой, и в этом вопросе не упоминается о необходимости сравнивать значения с плавающей запятой. Здесь нет ничего, чтобы указать, что вопроситель хочет сделать такие сравнения. Они спрашивают, почему они получили ценность, которую они не ожидали. Оценка предлагаемого вами сравнения не изменяет значение на ожидаемое или иным образом улучшает точность с плавающей запятой. В этом контексте это нецелесообразно. –

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