我怎样才能告诉perl:
print (log(1000)/log(10)."\n");
print int(log(1000)/log(10))."\n";
是否应该给3(而不是最后一个令人惊讶地给出的2)?
我知道为什么会发生这种情况(二进制浮点数不是十进制浮点数)。所以我不是在问为什么它发生了。我问 HOW 告诉perl“做正确的事”。
答案 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));