如何在JavaScript计算器中处理浮点?

如何在JavaScript计算器中处理浮点?,javascript,math,floating-point,precision,Javascript,Math,Floating Point,Precision,为什么这不是这些伟大的SO文章的副本? 虽然下面评论中链接的两篇文章都很好,但我特别想寻找一些信息,帮助我在原生JS中解决这个问题。我知道JS不应该是复杂数学的首选,但考虑到这个计算器在浏览器中运行的局限性,我决定使用它 背景 我正在尝试使用TypeScript制作一个计算器,它没有任何库(比如Big.js),也没有在计算器的内部逻辑中使用字符串连接 示例 当用户想要键入数字8.5时: 按下8键 按十进制键 按下5键 从数学上讲,我使用以下代码片段在显示屏中创建了这个数字: 8 + 5 *

为什么这不是这些伟大的SO文章的副本?

虽然下面评论中链接的两篇文章都很好,但我特别想寻找一些信息,帮助我在原生JS中解决这个问题。我知道JS不应该是复杂数学的首选,但考虑到这个计算器在浏览器中运行的局限性,我决定使用它

背景

我正在尝试使用TypeScript制作一个计算器,它没有任何库(比如Big.js),也没有在计算器的内部逻辑中使用字符串连接

示例

当用户想要键入数字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方面给我提供太多指导。我将编辑我的问题以反映这一点。您应该知道,没有任何计算或算法可以在JavaScript
Number
中生成8.55或8.555,因为这些值不能以
Number
所使用的格式表示。最接近的可能值是8.550000000000000710542735760100185871124267578125和8.55499999999715782905695992565155029296875。JavaScript可能重复的可能重复有一些已知的数学问题。第一个可能的重复有一个有趣的答案。我认为它们都让我对这个问题有了更好的高层理解,但它们都没有具体地在JavaScript方面给我提供太多指导。我将编辑我的问题以反映这一点。您应该知道,没有任何计算或算法可以在JavaScript
Number
中生成8.55或8.555,因为这些值不能以
Number
所使用的格式表示。最接近的可能值为8.550000000000000710542735760100185871124267578125和8.55499999999715782905695992565155029296875。这些用于显示的转换将成功隐藏许多错误,但无法解决将数字从输入十进制准确转换为内部
数字
格式的问题。该转换中的错误可能是