当前位置: 首页 > 知识库问答 >
问题:

在格式化浮点值时,JavaScript如何确定要产生的位数?

于恺
2023-03-14

在JavaScript中,大家都知道著名的计算:0.1+0.2=0.3000000000000004。但是为什么JavaScript打印这个值,而不是打印更精确、更精确的0.3000000000000000044408920985006呢?

共有1个答案

巫马山
2023-03-14

number值转换为十进制数字时,JavaScript的默认规则是使用足够的数字来区分number值。(您可以使用toprecision方法请求更多或更少的数字。)

JavaScript使用IEEE-754基本64位二进制浮点作为其number类型。使用IEEE-754,.1+.2的结果正好是0.30000000000000000444089209850062616169452667236328125。这是由于:

  • 将“.1”转换为数字类型中可表示的最接近的值。
  • 将“.2”转换为数字类型中可表示的最接近的值。
  • 将上述两个值相加,并将结果舍入为数字类型中可表示的最接近的值。

在设置此number值的格式以供显示时,“0.300000000000000004”的有效数字刚好足以唯一区分该值。要了解这一点,请注意相邻值为:

  • <代码>0.2999999999999999999999888997769753748434595763683319091796875
  • 0.30000000000000000444089209850062616169452667236328125,以及
  • <代码>0.30000000000000000099920072216264088638126850128173828125

如果转换为十进制数字只产生“0.3000000000000000000”,则它将更接近于0.29999999999999999999888997769753748434595763683319091796875而不是0.30000000000000000444089209850062616169452667236328125。因此,需要另一个数字。当我们有这个数字“0.300000000000000004”时,结果更接近于0.30000000000000000444089209850062616169452667236328125。因此,“0.3000000000000000004”是最短的十进制数字(忽略前导的“0”,该数字出于美观目的而存在),它唯一地区分了原始值是哪个可能的number值。

此规则来自ECMAScript 2017html" target="_blank">语言规范第7.1.12.1条中的步骤5,该步骤是将number值m转换为用于toString操作的十进制数字的步骤之一:

否则,设n、k和s为整数,使得k≥1,10k-1≤s<10k,则s×10n-k的数值为m,k尽可能小。

这里的措辞有点不准确。我花了一段时间才弄明白,“s×10n-k的数字值”是指将数学值s×10n-k转换为Number类型(使用通常的舍入)的结果的数字值。在这个描述中,k是将要使用的有效位数,这个步骤告诉我们最小化k,所以它说要使用最小的位数,这样我们生成的数字将在转换回number类型时生成原始数字m。

 类似资料:
  • 问题内容: 我正在尝试设置python 库,以便将包含其他字典作为元素的字典保存到文件中。浮点数很多,我想将位数限制为例如。 根据其他帖子,应使用SO 。但是,它不起作用。 例如,下面的代码在Python3.7.1中运行,将打印所有数字: 我该如何解决? 可能无关紧要,但我在macOS上。 编辑 该问题被标记为重复。但是,在原始帖子的已接受答案(到目前为止是唯一的答案)中明确指出: 注意:此解决方

  • 问题内容: 我有一个类型的变量,我需要以不超过3个小数的精度打印它,但是它不应该有任何结尾的零… 例如。我需要 我尝试使用,我做错了吗? 谢谢。:) 问题答案: 尝试使用模式代替: 输出:

  • 问题内容: 我的python脚本中有一个数字,希望用作matplotlib中图形标题的一部分。是否有将浮点数转换为格式化的TeX字符串的函数? 基本上, 退货 但是我想要 或至少让matplotlib格式化浮点格式,就像格式化第二个字符串一样。我也一直使用python 2.4,因此特别喜欢在旧版本中运行的代码。 问题答案: 您可以执行以下操作: 在旧样式中:

  • 问题内容: 如何按照以下要求将浮点数格式化为固定宽度: 如果n <1前导零 添加尾随的十进制零以填充固定宽度 截断超出固定宽度的十进制数字 对齐所有小数点 例如: 输出会像 问题答案: 版画 花括号内的格式说明符遵循Python格式字符串语法。具体来说,在这种情况下,它由以下部分组成: 该空字符串冒号前的手段“采取下一个提供参数 -在这种情况下,作为唯一的参数。 在冒号之后的部分是格式规范。 的f

  • 本文向大家介绍如何在Python中将浮点数格式化为固定宽度?,包括了如何在Python中将浮点数格式化为固定宽度?的使用技巧和注意事项,需要的朋友参考一下 您可以使用字符串格式在Python中将浮点数格式设置为固定宽度。例如,如果您希望小数点与小数点右边的12个字符和4位数字的宽度对齐,则可以使用以下命令: 您还可以使用字符串插值和格式化来实现此结果。例如:

  • 程序是这样的。它的意思是根据工作时数、时薪、扣缴税款等来计算员工的净工资。它计算正确,但双点精度格式将最后一个小数四舍五入,失去了计算的准确性。 示例输入: } 请怜悯;我是一年级学生。