Kotlin 为什么String.toDouble()会增加小数位数?

Kotlin 为什么String.toDouble()会增加小数位数?,kotlin,Kotlin,我有一个服务器返回一个值(JSON格式),其中包含一个带小数位的数字,例如203.14 因为在我的应用程序中,我需要进行一些计算,所以我必须将其转换为Double 但是,当转换为Double时,其值变为203.13999938964844 出于某些业务逻辑原因,当我显示该值时,我需要将该数字四舍五入到小数点后2位 现在它变成了203.13,比服务器返回的值小0.01 当我将“203.14”转换为双精度时,如何保留203.14 更新: 我刚刚发现原因是模型类使用了float来接受服务器值,但后来转

我有一个服务器返回一个值(JSON格式),其中包含一个带小数位的数字,例如
203.14

因为在我的应用程序中,我需要进行一些计算,所以我必须将其转换为
Double

但是,当转换为Double时,其值变为
203.13999938964844

出于某些业务逻辑原因,当我显示该值时,我需要将该数字四舍五入到小数点后2位

现在它变成了
203.13
,比服务器返回的值小0.01

当我将
“203.14”
转换为双精度时,如何保留
203.14

更新:
我刚刚发现原因是模型类使用了
float
来接受服务器值,但后来转换为
Double
。如果模型类在第一天使用
double
接受该值,则上述问题将不存在。

在我看来,数字的实际值是203.1399999999,但在输出数据时,字符串格式将其舍入为203.14。如果是这种情况,那么在将数字转换为双精度之前,请尝试对其进行四舍五入

如果不起作用,请尝试使用以下方法之一,而不是您当前使用的方法: Double.parseDouble()
Double.valueOf()

初始化Double后尝试使用此舍入方法:

fun Double.round(decimals: Int): Double {
    var multiplier = 1.0
    repeat(decimals) { multiplier *= 10 }
    return round(this * multiplier) / multiplier
}
您可以这样使用它:

3.14159265359.round(2)

为什么将该值四舍五入得到一个较小的数字?如果您向下取整而不是算术运算,则给定的双精度值将只四舍五入到
203.13
,这是否回答了您的问题?如果需要精确的浮点计算,请使用
BigDecimal
。如果您只是想解决显示问题,请舍入而不是截断。@NicoHaase是的,我必须将其舍入。关于您的更新:将float更改为double可能会解决此特定值的问题,但不会解决所有数字的问题。double为您提供两倍的精度,但不是绝对精度。不,服务器返回的值正好是
203.14
。您使用什么方法将203.14转换为double?@SiraLam无法准确地用二进制浮点表示203.14-point@SiraLam
服务器返回的值正好是203.14
否,因为
203.14
没有
double
使用的浮点格式的精确(终止)表示。