lua - 为什么 Lua 以这种方式工作以及如何解决浮点数问题?
问题描述
那是我的代码:
a=20.4*100
print(a,math.floor(a),math.floor(2040))
结果在控制台:
2040 2039 2040
如果 a==2040 那么为什么当我math.floor
使用该数字时,它会减少?我怎样才能写出比这种奇怪行为更精确的数学函数?
解决方案
简单地说:计算机没有无限的内存,所以它们只能使用这么多位来存储一个数字。如果数字有太多小数,它们会在某个地方被截断,而二进制表示的 0.4(五分之二)的小数点数多于它可以保存的小数点。所以在切断它们之后,你会得到 0.399999something,它print
足够聪明,可以打印为 0.4,但如果你floor()
这样做,它会毫不留情地四舍五入,从而得到你看到的结果。
另请注意,您可能只是用谷歌搜索过这个;这是编程中最常见的问题之一;)
例如,试试这个:
string.format("%f", 20.4*100)
--> 2040.000000
string.format("%0.20f", 20.4*100)
--> 2039.99999999999977262632
推荐阅读
- ios - 折叠/展开后在 SplitViewController 中保留模态演示
- python - dask:并行模型中的共享内存
- typescript - 为什么 Typescript 不以正确的方式支持函数重载?
- javascript - 如何使用 javascript/jquery 用标签包装元素的兄弟文本?
- math - 在第一象限中查找圆和两条直线的切点
- sql - 根据日期逻辑在表中插入行 - sql/hive
- php - 使用 PHP 脚本在命令行中运行 PHP 文件
- java - Spring Boot - 自定义查询上的空指针
- java - Elasticsearch计数嵌套对象列表的数量(java)
- filesystems - 我在 Ubuntu16.04 中尝试 cd 代码,但屏幕显示输入/输出错误'