kotlin - 如何在不损失精度的情况下乘以双精度数?
问题描述
鉴于此功能:
fun multiplyByHundred(num:Double):Double{
return num * 100
}
这些是一些输入的结果:
69.56 => 6956.0
69.57 => 6956.999999999999
69.58 => 6958.0
69.59 => 6959.0
- 为什么 69.57 会导致 6956.999999999999?
- 如何在不丢失精度的情况下正确进行此计算并使其与任何 Double 一起使用?
解决方案
你不能。Adouble
只能表示实数的稀疏子集。double
如果您可以适当地格式化输出(这基本上是 Microsoft Excel 所做的,以及一些非常巧妙的表达式技巧,如 1/3 + 1/3 + 1/3),您可能会侥幸逃脱。
如果您需要完美的精度,请使用能够做到这一点的类型。十进制类型BigDecimal
可能是您想要的。
如果您使用金钱,并且不需要担心具有 1000 的货币(例如突尼斯第纳尔)或比特币(8 位小数),那么以美分工作并使用整数是一种方法。
推荐阅读
- mysql - How to delete rows using 2 different columns as condition in a SQL query?
- typescript - 继续在泛型类型工厂上打字
- opencv - go运行时golang gocv错误./cmd/version/main.go
- c++ - 将 uint32_ts 和 uint_8ts 作为字符写入文件,然后将它们转换回 uint32_ts 和 uint_8ts
- python - 为什么我在尝试使用 tkinter 创建多个窗口时收到错误消息?
- c# - ZipArchive 是否将整个 zip 文件加载到内存中
- laravel - laravel 中唯一的验证规则
- git - 如何在签出到新的本地分支时运行脚本
- r - r data.table 如果缺少数据表,则插入特定行
- node.js - Mongoose 不保存我的数据,错误消息:无法读取未定义的属性 'then'