kotlin - Kotlin double 大于 float 错误表达式解决
问题描述
我遇到了一个问题,我想知道预期的行为是否正确,或者我是否发现了错误。
鉴于这种:
0.08 > 0.08 == false
0.08 > 0.08F == true
0.08 > 0.08F.toDouble() == true
0.08.toFloat() > 0.08F == false
为什么第三个表达式不为假?有任何想法吗?
解决方案
这不是错误,它基于舍入错误。
执行以下代码:
val d = 0.08
val f = 0.08F
val fd = f.toDouble()
print("%.20f".format(d) + "\n")
print("%.20f".format(f) + "\n")
print("%.20f".format(fd))
为您提供以下输出:
0.08000000000000000000
0.07999999821186066000
0.07999999821186066000
如您所见,0.08 双精度值(直到小数点后 20 位)精确到 0.08,而浮点数(由于精度较低)无法精确表示,因此它包含一个舍入值,略低于 0.08
将您的近似(略低)0.08 浮点数转换为双精度数并不会提高您的精度,您仍然有浮点数的舍入误差,这导致转换后的双精度数要低一点。
// 编辑:如果您对浮点数的确切工作原理感兴趣,我建议您查看关于浮点运算的维基百科文章和这个问题:浮点数学是否损坏?
推荐阅读
- r - R错误-在已安装的包中找不到功能
- html - 谷歌汽车广告添加无用 P
- python - 在 matplotlib 中创建一个空的 pcolormesh
- javascript - 如何创建滚动按钮
- html - 使用对象匹配消除“填充”(视觉空间),或者,如何缩放一行图像以正确适应 div?
- python - Conda.exe 运行失败,访问被拒绝 C:\Code\JiraData\ExecuteJiraExtract.ps1:31 char:1
- asp.net - ASP.Net MVC 3 中的远程验证 - 防止注册重复用户名的过程
- three.js - 出现在特定 GPU 上的片段着色器法线伪影
- python-3.x - GAE 文件由于具有多个 . 的 js 文件的 mimetype/未知 url 处理程序类型而被阻止
- aframe - 来自相机的视频在身体上设置了固定尺寸并且正在损坏我的响应站点