ASP Fix/Int 函数未按预期运行

问题描述 投票:0回答:1

在调试时,我在自定义 RoundMid() 函数中发现了这个奇怪的事情:

    test = 148.325 * 100 + 0.5
    Response.Write test ' Returns 14833
    Response.Write Fix(test) ' Returns 14832 ???????

    test = 14832.5 + 0.5
    Response.Write test ' Returns 14833
    Response.Write Fix(test) ' Returns 14833

使用 Int() 而不是 Fix() 也有同样的问题。
知道我该怎么做才能在第二行获得 14833 吗?
谢谢你。

vbscript integer asp-classic rounding
1个回答
0
投票

在第二次计算中,数字0.5和14832.5都可以表示为2的幂。 它们可以精确地以二进制形式存储,没有舍入错误。

0.5 = 2-1
14832.5 = 213 + 212 + 211 + 28 + 27 + 26 + 25 + 24 + 2-1

14832.5 + 0.5 之和也可以准确表示:
14833 = 213 + 212 + 211 + 28 + 27 + 26 + 25 + 24 + 20

在第一个计算中,100 可以精确地用二进制表示:
100 = 26 + 25 + 22
但数字148.325无法准确表示。这个数字的二进制表示是:
10010100.010 1001 1001 1001 ... 1001 重复。

因此,无论使用多少位数,二进制表示形式都将始终略小于 148.325。

将计算148.325 * 100 + 0.5的小数部分截去后,结果为14832。

© www.soinside.com 2019 - 2024. All rights reserved.