2017-06-21 61 views
0

我最近碰到下面的好奇心:當從串聯到字符串連接時從雙精度到浮點精度?

double d=0.8608278036117554; 
    String precision="float"; 

    float f=(float)d; 
    String s="a " + (precision.equals("float") ? (float)d: d) + " Bonjour"; 
    String s2="a " + String.valueOf(precision.equals("float") ? (float)d: d) + " Bonjour"; 
    String s3="a " + (precision.equals("float") ? String.valueOf((float)d): String.valueOf(d)) + " Bonjour"; 


    println(d); 
    println(f); 
    println(s); 
    println(s2); 
    println(s3); 


//0.8608278036117554 
//0.8608278 
//a 0.8608278036117554 Bonjour 
//a 0.8608278036117554 Bonjour 
//a 0.8608278 Bonjour 

爲什麼不能有一個很好的浮動計算時小號S2? 爲什麼在ss2的情況下仍然是雙倍的?

PS:在我看來,這個問題與數字格式無關。我真的很想理解爲什麼(float)d演員不工作!

+1

「boolean?」的結果? float:double'是一個'double'這是鑄造浮起來的,但是它正在被轉換成一個double。 –

回答

3

你的表達precision.equals("float") ? (float)d: d沒有任何效果,作爲條件運算符具有一個單一的所得類型,這是double如果一個參數具有類型float,而另一個具有類型double

所以第一替代將從float差擴大到double和在轉換從doublefloat和回double可能對值的影響,將String.valueOf(double)在任一情況下被調用。

您可以使用(precision.equals("float") ? String.valueOf((float)d): String.valueOf(d))替代,其方法調用不是多餘的,因爲它們是調用不同的方法String.valueOf(float)String.valueOf(double)

也就是說,你不應該使用縮小到float來控制輸出。 檢查Format Float to n decimal places提供更多控制格式化輸出的替代方案。

+0

我現在明白了。但是,如果它被拋到了一個浮點上並且翻倍,那麼精度怎麼會不會丟失呢?我不應該在最後有一堆零而不是真正的雙精度小數? – Myoch

+1

'float'和'double'的精度是用* binary *數字來定義的,而不是十進制數字。對於某些值,這種轉換可能會截斷某些非零位(這就是爲什麼我說* *可能影響該值),但結果值不一定是小數位數較少的值。 – Holger

+0

事實上,我已經嘗試了來回演出,與整個「絃樂」的東西分開,我得到了同樣的浮法。所以如果我理解的很好,這真是一個巧合,導致回到同樣的雙倍,並且我選擇了另一個例子,我可以發現數字的變化,對吧? – Myoch