2017-08-26 1144 views
3

我想找到一個簡單的方法來舍入一個雙精度到兩位小數。我正在使用BigDecimal來完成這個技巧,但注意到java.math.BigDecimal類的函數doubleValue不存在。在Kotlin中將Double舍入到小數點後兩位。 BigDecimal.doubleValue不存在?

以下功能:

fun Double.roundTo2DecimalPlaces() = 
    BigDecimal(this).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue()  

是給我這個編譯錯誤:

:compileKotlin 
Using kotlin incremental compilation 
w: The '-d' option with a directory destination is ignored because '-module' is specified 
e: -{FilePathAndNameWereHere}-: (20, 14): Unresolved reference: doubleValue 
:compileKotlin FAILED 

科特林版本1.1.1

回答

7

你能不能用toDouble()代替,即:

fun Double.roundTo2DecimalPlaces() = 
    BigDecimal(this).setScale(2, BigDecimal.ROUND_HALF_UP).toDouble() 
+0

謝謝! ;) 你說對了!原來我也在使用BigDecimal。我更新了我的問題,以便正確使用BigDecimal。但留下原始問題的錯誤。您可以編輯您的答案,以便人們不會複製破損的代碼。 ''''setScale'''函數實際返回一個新的BigDecimal。 '''toDouble'''是關鍵!你是老闆。 –

+0

你對編輯你的答案有什麼看法,以反映方法的正確使用。由於該方法不會輪,因爲d.setScale不會改變原始對象。 –

+0

我確實試圖通過編輯,但被社區拒絕:https://stackoverflow.com/review/suggested-edits/17149135如果我能得到一個很好的理由,不要介意重新接受這個答案。或者更有利於我的意見,如果代碼的不正確部分與問題無關,則會發生變化。 –

0

我發現這個問題,尋找如何更換的Javascript`toFixed(n)

fun Double.toFixed(s : Int): Double { 
    if (s==0) return round(this) 
    val power = (10.0).pow(s) 
    return round(this * power)/power 
} 

這種方法比X20轉換爲BigDecimal快,但由浮點不精確在極端的例子受到影響。

Assert.assertEquals(4238764872.745398676, 4238764872.745398675983467.toFixed(9), 0.00000000001) 

未能針對上述情況,但接受的答案成功(改變尺度參數)

相關問題