2017-01-23 27 views
0
double temp = 64.1; 
System.out.println("Result = " + (temp*1000)); 

其結果將是:與詮釋問題上搞雙重倍增

Result = 64099.99999999999 

但實際的結果應該是64100

在雙數據類型的情況下

double a = ((temp * 1000) % (0.5 * 1000)); 
a=7.275957614183426E-12; 

在的情況下,將其投入浮動

((((float) temp) * 1000) % (0.5 * 1000)); 
a=0.0; 

爲什麼會這樣?

+0

所以,你的答案是64100 –

+1

投票這是http://stackoverflow.com/questions/179427/how-to-resolve-a-java-rounding-double的副本的-issue – Kerooker

+5

可能的複製[如何解決一個Java的舍入雙問題(http://stackoverflow.com/questions/179427/how-to-resolve-a-java-rounding-double-issue) – Kerooker

回答

-1

嘗試了這一點

double temp = 64.1; 
int x = 1000; 
System.out.println("Answer :" + Math.round((temp*x))); 
0

我認爲你可以使用小區(JAVA)的方法。

double temp = 64.1;

的System.out.println( 「結果=」 + Math.ceil(溫度* 1000));

我希望這會有所幫助。

3

是一個典型的數值問題與浮點數,當你多個例如double * int。

首先選擇使用Math.round:

Math.round((temp*1000)) 

第二個選項使用BigDecimal類:

BigDecimal temp = BigDecimal.valueOf(64.1); 
BigDecimal thousand = BigDecimal.valueOf(1000); 
BigDecimal result = temp.multiply(thousand); 

//example how to extract int or double value 
int intResult = result.intValue(); 
double doubleResult = result.doubleValue(); 
System.out.println("Result = " + result); 
0

雙Java中表示浮點數。它具有64位的值,其包括:

  • 符號位:1位
  • 指數:11個比特
  • 重大精度:53位(52明確地存儲)

來源:https://en.wikipedia.org/wiki/Double-precision_floating-point_format

不像定點數(字節,整型,長),浮點數不能總是一致地返回了若干完全相同的表示。這就是爲什麼你得到結果64099.99999999999而不是64100的原因。

在Java中使用BigDecimal以更好地控制小數位數。

來源:https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html