問題描述
我有一個原始浮點數,我需要一個原始雙精度數.簡單地將浮點數轉換為 double 會給我帶來奇怪的額外精度.例如:
I have a primitive float and I need as a primitive double. Simply casting the float to double gives me weird extra precision. For example:
float temp = 14009.35F;
System.out.println(Float.toString(temp)); // Prints 14009.35
System.out.println(Double.toString((double)temp)); // Prints 14009.349609375
但是,如果我不進行強制轉換,而是將浮點數輸出為字符串,并將字符串解析為雙精度,我會得到我想要的:
However, if instead of casting, I output the float as a string, and parse the string as a double, I get what I want:
System.out.println(Double.toString(Double.parseDouble(Float.toString(temp))));
// Prints 14009.35
有沒有更好的方法而不是去字符串然后返回?
Is there a better way than to go to String and back?
推薦答案
并不是你實際上獲得了額外的精度 - 而是浮點數沒有準確地代表你的目標數字起初.double is 準確地代表了原來的浮點數;toString
正在顯示已經存在的額外"數據.
It's not that you're actually getting extra precision - it's that the float didn't accurately represent the number you were aiming for originally. The double is representing the original float accurately; toString
is showing the "extra" data which was already present.
例如(這些數字不正確,我只是在編造)假設你有:
For example (and these numbers aren't right, I'm just making things up) suppose you had:
float f = 0.1F;
double d = f;
那么 f
的值可能正好是 0.100000234523.d
將具有完全相同的值,但是當您將其轉換為字符串時,它會相信"它的精確度更高,因此不會提前四舍五入,您會看到已經存在但對您隱藏的額外數字".
Then the value of f
might be exactly 0.100000234523. d
will have exactly the same value, but when you convert it to a string it will "trust" that it's accurate to a higher precision, so won't round off as early, and you'll see the "extra digits" which were already there, but hidden from you.
當您轉換為字符串并返回時,您最終會得到一個比原始浮點數更接近字符串值的雙精度值 - 但這只是 如果 你真的相信字符串值是您真正想要的.
When you convert to a string and back, you're ending up with a double value which is closer to the string value than the original float was - but that's only good if you really believe that the string value is what you really wanted.
您確定 float/double 是此處使用的合適類型,而不是 BigDecimal
?如果您嘗試使用具有精確十進制值的數字(例如貨幣),那么 BigDecimal
是更合適的 IMO 類型.
Are you sure that float/double are the appropriate types to use here instead of BigDecimal
? If you're trying to use numbers which have precise decimal values (e.g. money), then BigDecimal
is a more appropriate type IMO.
這篇關于將 float 轉換為 double 而不會丟失精度的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!