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

結果は次のようになります。ダブル乗算

Result = 64099.99999999999 

しかし、実際の結果は、ダブルデータ型の場合は

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

の場合64100

する必要がありますキャストして浮上させる。

((((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 Rounding Double issueを解決する方法](http://stackoverflow.com/questions/179427/how-to-resolve-a-java-rounding-double-issue) – Kerooker

答えて

-1

は、私はあなたがJAVAのはceil()メソッドを使用することができると思う

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

これを試してみてください。

倍長整数= 64.1;

System.out.println( "Result =" + Math.ceil(temp * 1000));

こちらがお役に立てば幸いです。

3

浮動小数点数がの数値問題(例:)です。 double * int。

まずオプションの使用恐らくMath.round:

Math.round((temp*1000)) 

2番目のオプションを使用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で二重のは、浮動小数点数を表します。

  • 符号ビット:1ビット
  • 指数:それから成る64ビットの値を有し、11ビット
  • 重要精度:53ビット(明示的に格納されている52)

出典:https://en.wikipedia.org/wiki/Double-precision_floating-point_format

固定小数点数(byte、int、long)とは異なり、浮動小数点数は必ずしも正確に同一の数値表現を常に返すことはできません。その結果、64100の代わりに64099.99999999999という結果が得られます。

小数点以下の桁数をより適切に制御するには、JavaでBigDecimalを使用します。

出典:だからhttps://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html