【问题标题】:How do I extract an individual number from a float如何从浮点数中提取单个数字
【发布时间】:2021-04-12 17:37:57
【问题描述】:

我需要从浮点数中提取单个数字而不将浮点数转换为字符串,但不知道该怎么做。我正在考虑类似 substr 的东西。但要一个数字。

【问题讨论】:

  • 你能发布一个你需要获得什么的例子吗?你需要隔离一个数字吗?
  • 是的,这正是我所需要的。假设我有数字 14。我想提取 1 和 4,以便将这两个加在一起。
  • 为什么需要在不转换为字符串的情况下这样做?

标签: javascript floating-point extract


【解决方案1】:

你可以把你想要的数字提取成一个字符串,然后使用 Number() 方法把这个字符串变成一个数字。

【讨论】:

  • 他说他不想把它转换成字符串。
  • 但是他可以在后面用 Number() 把它变成一个数字,所以它没有任何区别
【解决方案2】:

假设你有一个像这样的浮点数:

x = 45783.7304

我们需要百分之一的数字

n = 0.01

result = Math.floor(x / n) %  10

如果你需要千位:

x = 45783.7304
n = 1000
result = Math.floor(x / n) %  10

或者您可以将不同的数字拆分为一个数组(但您必须求助于字符串):

digits = x.toString().replace(".","").split("").map(Math.floor)

【讨论】:

  • 对于x = 0.0299999999999999988897769753748434595763683319091796875,这报告小数点后的第二个数字是3,但它是2。
  • 请注意,由于浮点舍入错误,这可能不会在小数点后产生与转换为字符串相同的数字,
  • 您不能将这样的数字存储在浮点数中。赋值后x值为0.03。它是离散数学计算机使用所固有的。由于规范规定您在检索浮点数时必须从浮点数中检索一个数字,因此您会得到一个 3.@EricPostpischil
  • @Eineki 0.0299999999999999988897769753748434595763683319091796875 是最接近 IEEE 754 双精度浮点到 0.03 的精确十进制表示
  • @aka.nice 也许我必须更好地解释我的意思。由于 javascript 中的 Number Object 具有 17 个小数位的精度,因此在内部被处理为双浮点数时,您必须对其进行四舍五入并将其减少到 0.03。因此,您不能在 javascript 数字对象中保存该数字。也许这个限制只是该语言的 Mozilla 实现,因为我在 ecma 脚本规范中没有发现这个限制。
【解决方案3】:

如果您正在考虑基于二进制的浮点数的十进制表示,即使采用字符串表示,您所问的问题已经很不明确了,因为您有多种打印浮点数的十进制表示的方法,例如:

  • 浮点数的精确十进制表示
  • 浮点数的最短十进制表示,在往返转换中将被解释回相同的浮点数
  • 浮点数的近似十进制表示,四舍五入(或截断,或...)到固定位数/或小数位。

举个例子,假设你从最接近 0.0012345 的浮点数开始

  • 该浮点数在 IEEE 754 双精度中的精确表示为 0.0012344999999999999203137424075293893110938370227813720703125
  • 转换回相同浮点数的最短十进制表示 - 假设舍入到最接近的值,甚至默认舍入模式 - 是 0.0012345
  • 四舍五入或截断到小数点后 6 位(4 位有效数字)导致 0.001234

但是让我们取最近的浮点数到 0.012345

  • 该浮点数的精确十进制表示为 0.01234500000000000007049916206369744031690061092376708984375
  • 最短的是0.012345
  • 截断为 5 位为 0.01234
  • 四舍五入到 5 位是 0.01235

我们看到,根据选择的字符串表示,您的结果可能会略有不同。

如果不使用字符串表示,情况会变得更糟,因为您使用浮点算术单元执行的每个操作都会将结果四舍五入到最接近的浮点数,因此可能会导致数字的一些细微差异。如果您考虑将这些不精确的操作中的几个链接起来,那就更糟了!

例如,为了简洁起见,使用最短的十进制表示,最简单的链接给出:

0.0012345 * 1000000 -> 1234.5
0.0012345 * 10 * 10 * 10 * 10 * 10 * 10 -> 1234.4999999999998

这些操作的确切值 1234.4999999999999203137424075293893110938370227813720703125 当然不能表示为浮点数,最接近的浮点数是 1234.5(精确)。

您能想到的最简单的事情是尽快将浮点数转换为二进制小数的精确十进制数,然后对这些数字进行运算 - 很确定您会找到专门的 JavaScript 库来执行此操作。但请三思而后行,因为混合浮点数和十进制表示是获得令人惊讶(意外)结果的秘诀,除非非常小心!

根据您的目的,您不妨完全避免使用浮点表示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-04
    • 2011-06-09
    相关资源
    最近更新 更多