2013-03-07 80 views
0

我有這樣的Java代碼來計算罪(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 – 2013-03-07 13:26:45

回答

0

你總是可以使用十進制格式:

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

爲什麼用這種方式downvote?使用格式化程序快速舍入到所需的小數位非常有效。 – vikingsteve 2013-03-08 12:03:59

4

在處理浮點值時,應該使用abs(sin360 - 0) < delta(其中delta非常小,如0.0000001)而不是sin360 == 0。這是浮點內部表示問題。 What Every Computer Scientist Should Know About Floating-Point Arithmetic

+0

爲什麼你會建議評估這個比較?問題中的代碼不包含任何浮點比較,並且該問題沒有提及要比較浮點值。這裏沒有什麼可以表明提問者想要進行這種比較。他們問爲什麼他們得到了他們沒有想到的價值。評估你所建議的比較不會改變它們所期望的值或提高浮點精度。在這方面它沒有任何用處。 – 2013-03-07 21:46:55