首页 > 解决方案 > 如何在不损失精度的情况下乘以双精度数?

问题描述

鉴于此功能:

fun  multiplyByHundred(num:Double):Double{
    return num * 100
}

这些是一些输入的结果:

69.56 => 6956.0

69.57 => 6956.999999999999

69.58 => 6958.0

69.59 => 6959.0

  1. 为什么 69.57 会导致 6956.999999999999?
  2. 如何在不丢失精度的情况下正确进行此计算并使其与任何 Double 一起使用?

标签: kotlindoubleprecision

解决方案


你不能。Adouble只能表示实数的稀疏子集。double如果您可以适当地格式化输出(这基本上是 Microsoft Excel 所做的,以及一些非常巧妙的表达式技巧,如 1/3 + 1/3 + 1/3),您可能会侥幸逃脱。

如果您需要完美的精度,请使用能够做到这一点的类型。十进制类型BigDecimal可能是您想要的。

如果您使用金钱,并且不需要担心具有 1000 的货币(例如突尼斯第纳尔)或比特币(8 位小数),那么以美分工作并使用整数是一种方法。


推荐阅读