如何在JavaScript计算器中处理浮点?
为什么这不是这些伟大的SO文章的副本? 虽然下面评论中链接的两篇文章都很好,但我特别想寻找一些信息,帮助我在原生JS中解决这个问题。我知道JS不应该是复杂数学的首选,但考虑到这个计算器在浏览器中运行的局限性,我决定使用它 背景 我正在尝试使用TypeScript制作一个计算器,它没有任何库(比如Big.js),也没有在计算器的内部逻辑中使用字符串连接 示例 当用户想要键入数字8.5时:如何在JavaScript计算器中处理浮点?,javascript,math,floating-point,precision,Javascript,Math,Floating Point,Precision,为什么这不是这些伟大的SO文章的副本? 虽然下面评论中链接的两篇文章都很好,但我特别想寻找一些信息,帮助我在原生JS中解决这个问题。我知道JS不应该是复杂数学的首选,但考虑到这个计算器在浏览器中运行的局限性,我决定使用它 背景 我正在尝试使用TypeScript制作一个计算器,它没有任何库(比如Big.js),也没有在计算器的内部逻辑中使用字符串连接 示例 当用户想要键入数字8.5时: 按下8键 按十进制键 按下5键 从数学上讲,我使用以下代码片段在显示屏中创建了这个数字: 8 + 5 *
- 按下8键
- 按十进制键
- 按下5键
8 + 5 * 0.1
这是可行的,但如果我继续往下走,我会遇到意想不到的事情:
8.5 + 5 * 0.01 // 8.55
8.55 + 5 * 0.001 // 8.555000000000001
问题
在不将数字转换为字符串的情况下,处理此问题的最佳方法是什么?有没有一种智能的方法来限制计算器的精度,使它只支持小数点后这么多位的精度
谢谢你的帮助 使用.toFixed()
:
或.toPrecision()
:
根据你的需要
请注意,您不需要一直转换数字。转换的唯一位置是视图的最终输出。在这种情况下,我们甚至可以将其保留为字符串格式
这是对“如何管理”问题的回答(如描述中所示)。关于“为什么我们会得到这样的结果”-第一条评论回答得很好。使用.toFixed()
:
或.toPrecision()
:
根据你的需要
请注意,您不需要一直转换数字。转换的唯一位置是视图的最终输出。在这种情况下,我们甚至可以将其保留为字符串格式
这是对“如何管理”问题的回答(如描述中所示)。关于“为什么我们会得到这样的结果”-第一条评论是一个很好的答案。获取最接近用户输入的
数字的最简单方法是从用户的按键在字符串中构建一个数字,然后用string.toNumber()
转换它们
诸如8.55或8.555之类的数字在数字
格式中无法准确表示。最接近的值为8.550000000710542735760100185871124267578125和8.5549999999999715782905695992565155029296875。使用.toNumber()
转换字符串“8.55”和“8.555”时,应产生这些值
因为这些是最接近的可表示值,所以任何计算或算法都不能以数字
格式生成任何更接近的值。
对于简单的加法、减法和有限乘法,您可以通过在每次number
操作后四舍五入到所需的小数位数来模拟十进制算法。然而,这通常不是一种可行的方法,因为其他操作和各种操作序列将超出合理模拟十进制算法的能力。获取最接近用户输入的数字的最简单方法是从用户的按键构建字符串中的数字,然后将其转换使用String.toNumber()
诸如8.55或8.555之类的数字在数字
格式中无法准确表示。最接近的值为8.550000000710542735760100185871124267578125和8.5549999999999715782905695992565155029296875。使用.toNumber()
转换字符串“8.55”和“8.555”时,应产生这些值
因为这些是最接近的可表示值,所以任何计算或算法都不能以数字
格式生成任何更接近的值。
对于简单的加法、减法和有限乘法,您可以通过在每次number
操作后四舍五入到所需的小数位数来模拟十进制算法。然而,这通常不是一种可行的方法,因为其他操作和各种操作序列将超出合理模拟十进制算法的能力。JavaScript可能重复的可能重复在数学上有一些已知问题。第一个可能的重复有一个迷人的答案。我认为它们都让我对这个问题有了更好的高层理解,但它们都没有具体地在JavaScript方面给我提供太多指导。我将编辑我的问题以反映这一点。您应该知道,没有任何计算或算法可以在JavaScriptNumber
中生成8.55或8.555,因为这些值不能以Number
所使用的格式表示。最接近的可能值是8.550000000000000710542735760100185871124267578125和8.55499999999715782905695992565155029296875。JavaScript可能重复的可能重复有一些已知的数学问题。第一个可能的重复有一个有趣的答案。我认为它们都让我对这个问题有了更好的高层理解,但它们都没有具体地在JavaScript方面给我提供太多指导。我将编辑我的问题以反映这一点。您应该知道,没有任何计算或算法可以在JavaScriptNumber
中生成8.55或8.555,因为这些值不能以Number
所使用的格式表示。最接近的可能值为8.550000000000000710542735760100185871124267578125和8.55499999999715782905695992565155029296875。这些用于显示的转换将成功隐藏许多错误,但无法解决将数字从输入十进制准确转换为内部数字
格式的问题。该转换中的错误可能是