Kotlin: SumbyDouble возвращает дополнительные десятичные дроби - PullRequest
0 голосов
/ 10 ноября 2018

Я суммирую двойное значение от arraylist с его дополнительными десятичными числами как 99999, как это исправить, пожалуйста, руководство

ех

class ExDet{var expName:String ="",var expAmount:Double = 0.0}
    val arrayList = ArrayList<ExDet>()
        arrayList.add(ExDet("Abc 1",45.66))
        arrayList.add(ExDet("DEF 1",10.0))
        arrayList.add(ExDet("Lee 1",600.89))  
        arrayList.add(ExDet("Ifr 1",200.9))  

    var amt = arrayList.sumByDouble{ it.expAmount }

Ожидаемое значение суммы:

Amt = 857.45

Но возвращается

Amt = 857.4499999

Пример кода для тестирования

data class ExDet(var expName:String ="" ,var expAmount:Double=0.0)

fun main(args: Array<String>) {

        val arrayList = ArrayList<ExDet>()
        arrayList.add(ExDet("Abc 1",45.66))
        arrayList.add(ExDet("DEF 1",10.0))
        arrayList.add(ExDet("Lee 1",600.89))  
        arrayList.add(ExDet("Ifr 1",200.9)) 
    var amt = arrayList.sumByDouble{ it.expAmount }

    println("Amount is : $amt")

}

1 Ответ

0 голосов
/ 10 ноября 2018

Проблема , с которой вы столкнулись , заключается в том, что числа с плавающей запятой строятся поверх базы 2, а не базы 10.

Подумайте, как вы можете легко представить третью в виде дроби (1/3), но при преобразовании в десятичное число вы получите повторяющееся (повторяющееся) число после радиуса (т. Е. 0,33 ...). Некоторые десятичные числа повторяются при представлении в base-2, например x.9. Компьютер имеет конечное число битов, поэтому число (base-2) усекается. Все ошибки усечения могут складываться.

Вам необходимо округлить до требуемой точности (например, round(x * 100) / 100).

Если вас интересует только то, как оно отображается, вы можете использовать функцию format с чем-то вроде "% .2f".

String.format("%.2f", value)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...