2022-03-12

【Kotlin】奇妙的數字運算 Float, BigDecimal

最近遇到個題目,要進行數字運算,運算過程中會產生小數,如下:

2222 ÷ 80 後,扣除整數,只留下小數,再將小數 × 80

既然會產生小數,直覺就是將數字轉成 Float 運算,但算出來的結果卻不如預期
 
var ii = 2222

// 個別運算都正確
var i2 = (ii.toFloat()/80)	// 結果為 27.775
var i3 = ii/80	// 結果為 27

// 但擺在一起運算就出問題了
i4 = (ii.toFloat()/80) - (ii/80)    // 結果為 0.7749996, 而不是 0.775

// 做了各種嘗試後, toBigDecimal() 會維持數字的精度, 而不會產生預期外的結果
var i5 = (((ii.toFloat()/80).toBigDecimal() - (ii/80).toBigDecimal())*(80).toBigDecimal())    // 結果為 62.000
// 但我只要整數, 所以
var i5 = (((ii.toFloat()/80).toBigDecimal() - (ii/80).toBigDecimal())*(80).toBigDecimal()).toInt()
 

沒有留言:

張貼留言