【问题标题】:Explain: Math.fround() function说明: Math.fround() 函数
【发布时间】:2017-12-02 17:31:01
【问题描述】:

Math.fround() 函数是如何工作的。

Math.fround() 函数返回数字的最接近的浮点表示。

但是当它传递浮点数Math.fround(1.5) 时,它返回相同的(1.5)值。 但是当它传递浮点数Math.fround(1.55) 时,它会返回一个不同的值1.5499999523162841为什么和如何?

  • 我对 Math.fround() 的工作原理感到困惑。
  • 它与Math.round() 函数有何不同?
  • 还请告诉我为什么 Internet Explorer 不支持它。

【问题讨论】:

  • 你可以从JavaScript’s Number type in details开始你的理解
  • 我看不到那个页面 :(
  • 把数字写成二进制你就明白了。 1.5 是 2^0 + 2^-1 但 1.55 不能表示为 2 的幂的总和,所以它就像二进制表示的 iracional 数......这就是为什么你有这么多 diigtis ...
  • @RobG 很有趣,但是他们的 polyfill 不能在兼容的浏览器上工作,因为他们不使用 new 构造 Float32Array..

标签: javascript angularjs angular typescript math


【解决方案1】:

我从一些文件中得到了以下这些东西。如果您有更多详细信息,请分享您的答案。


我从ECMAScript® 2015 Language Specification 发现了一些关于Math.fround ( x ) 的信息

当使用参数 x 调用 Math.fround() 时,将执行以下步骤:

  • 如果 x 是 NaN,则返回 NaN。
  • 如果 x 是 +0、-0、+∞、-∞ 之一,则返回 x。
  • 设 x32 是使用 roundTiesToEven 将 x 转换为 IEEE 754-2008 binary32 格式的值的结果。
  • 设 x64 是将 x32 转换为 IEEE 754-2008 binary64 格式的值的结果。
  • 返回 x64 对应的 ECMAScript Number 值。

如果支持Float32Array,可以使用以下函数进行模拟:

Math.fround = Math.fround || (function (array) {
  return function(x) {
    return array[0] = x, array[0];
  };
})(Float32Array(1));

** 请分享更多答案以了解更多详情

【讨论】:

    【解决方案2】:

    要了解此功能的工作原理,您实际上必须了解以下主题:

    ECMA 脚本为转换指定the following algorithm

    当使用参数 x 调用 Math.fround 时,以下步骤是 采取:

    • 如果 x 是 NaN,则返回 NaN。
    • 如果 x 是 +0、-0、+∞、-∞ 之一,则返回 x。
    • 设 x32 是将 x 转换为 IEEE 754-2008 binary32 中的值的结果 使用 roundTiesToEven 格式。
    • 设 x64 为转换 x32 的结果 为 IEEE 754-2008 binary64 格式的值。
    • 返回 ECMAScript x64对应的数值。

    所以,让我们为1.51.55 这样做。

    Math.fround(1.5)

    1) 以 64 位浮点数表示

    0 01111111111 1000000000000000000000000000000000000000000000000000
    

    2) 用科学记数法表示

    1.1000000000000000000000000000000000000000000000000000 x 2^0
    

    3) 舍入到 23 位尾数

    1.10000000000000000000000
    

    4) 转换为十进制:

    1.5
    

    Math.fround(1.55)

    1) 以 64 位浮点数表示

    0 01111111111 1000110011001100110011001100110011001100110011001101
    

    2) 用科学记数法表示

    1.1000110011001100110011001100110011001100110011001101 x 2^0
    

    3) 舍入到 23 位尾数

    1.10001100110011001100110
    

    4) 转换为十进制:

    1.5499999523162841
    

    【讨论】:

    • 很好的解释老兄+1
    • @RameshRajendran,如果有帮助,请考虑接受)
    猜你喜欢
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    相关资源
    最近更新 更多