我正在尝试在 Stata 中舍入一个数字:
display round(1.015, .01)
这会产生 1.01 而不是预期的 1.02
至少这是我所期望的(理解我的期望可能不符合 Stata 使用的某些标准)。
关于如何使 Stata 符合我的期望的任何建议?
最佳答案
Stata 使用数字的 double 或 float 表示(即基数 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
将不工作,因为 base-2 舍入将有读取“1.015”时已经发生(即计算机将看到 1.01499999...*1000 = 1014.999...)。当然,如果您从其他地方(例如用户输入或读取文件)获取值 1.015,这也适用。
顺便说一句,Stata 在其舍入模式(也称为平局)上似乎非常安静。虽然它可能使用了 tie-up,但它也可能是 tie-to-even 或其他选项 - 最好不要依赖精确的中途行为,除非你能找到明确的规范.
关于rounding - Stata:舍入不正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32422691/