perl:记录四舍五入的怪异

时间:2017-02-05 01:44:55

标签: perl

我怎样才能告诉perl:

print (log(1000)/log(10)."\n");
print int(log(1000)/log(10))."\n";

是否应该给3(而不是最后一个令人惊讶地给出的2)?

我知道为什么会发生这种情况(二进制浮点数不是十进制浮点数)。所以我不是在问为什么它发生了。我问 HOW 告诉perl“做正确的事”。

1 个答案:

答案 0 :(得分:5)

log(1000)和log(10)都不能用浮点数准确表示,所以最终会得到一些小于3的东西。

$ perl -e'CORE::say sprintf "%.20f", log(1000)/log(10)'
2.99999999999999955591

你想要圆而不是截断。

解决方案是滥用字符串化。

say int("".(log(1000)/log(10)));
say int("".(log(1000000)/log(10)));

或者您可以使用sprintf(比上面的字符串化更慢)。

say sprintf("%.0f", log(1000)/log(10));
say sprintf("%.0f", log(1000000)/log(10));