Stata:四舍五入不正确?
Stata: Round not rounding correctly?
我正在尝试在 Stata 中四舍五入一个数字:
display round(1.015, .01)
这会产生 1.01 而不是预期的 1.02
至少这是我所期望的(理解我的期望可能不符合 Stata 使用的某些标准)。
关于如何使 Stata 的行为符合我的期望有什么建议吗?
Stata 使用双精度或浮点数表示数字(即基数 2 而不是基数 10)。不幸的是,1.015 不能以 2 为基数表示,因此它会求到最接近的值,在本例中略小于 1.015,因此该轮下降。这是在计算机上处理浮点精度时的常见问题 - 例如,请参阅 Ruby 中的这个问题:Ruby Float#round method behaves incorrectly with round(2)
那么如何解决呢?
如果小数点后 3 位精度对您很重要,则需要使用 定点 精度。我不相信 Stata 本身支持这个,但你自己做起来很容易:
display round(1015, 10)*0.001
即您输入的数字乘以 10^3,您显示的数字乘以 10^-3。因此,所有处理都以您感兴趣的小数位数的整数精度进行。
但是请注意,看似等价的 display round(1.015*1000, 0.01*1000)*0.001
不会 起作用,因为在读取“1.015”(即计算机会看到 1.01499999...*1000 = 1014.999...)。当然,如果您从其他地方获取值 1.015,例如用户输入或读取文件,这也适用。
顺便说一句,Stata 在舍入模式(也称为平局)方面似乎非常安静。虽然它 可能 使用并列,但也可能是并列或其他选项 - 最好不要依赖精确的中途行为,除非你能找到一个明确的规格。
我正在尝试在 Stata 中四舍五入一个数字:
display round(1.015, .01)
这会产生 1.01 而不是预期的 1.02
至少这是我所期望的(理解我的期望可能不符合 Stata 使用的某些标准)。
关于如何使 Stata 的行为符合我的期望有什么建议吗?
Stata 使用双精度或浮点数表示数字(即基数 2 而不是基数 10)。不幸的是,1.015 不能以 2 为基数表示,因此它会求到最接近的值,在本例中略小于 1.015,因此该轮下降。这是在计算机上处理浮点精度时的常见问题 - 例如,请参阅 Ruby 中的这个问题:Ruby Float#round method behaves incorrectly with round(2)
那么如何解决呢?
如果小数点后 3 位精度对您很重要,则需要使用 定点 精度。我不相信 Stata 本身支持这个,但你自己做起来很容易:
display round(1015, 10)*0.001
即您输入的数字乘以 10^3,您显示的数字乘以 10^-3。因此,所有处理都以您感兴趣的小数位数的整数精度进行。
但是请注意,看似等价的 display round(1.015*1000, 0.01*1000)*0.001
不会 起作用,因为在读取“1.015”(即计算机会看到 1.01499999...*1000 = 1014.999...)。当然,如果您从其他地方获取值 1.015,例如用户输入或读取文件,这也适用。
顺便说一句,Stata 在舍入模式(也称为平局)方面似乎非常安静。虽然它 可能 使用并列,但也可能是并列或其他选项 - 最好不要依赖精确的中途行为,除非你能找到一个明确的规格。