-1

为什么

var test = Math.Log(125,5);
Console.WriteLine(test % 1); 

返回4.44089209850063E-16

4

1 回答 1

0

根据参考资料,作品的重要部分是Math.Log这样的:

return (Log(a)/Log(newBase));

其中单参数Log计算自然对数。这是为不同基数实现浮点对数的自然方式。自然对数当然一般来说并不精确,它们中的大多数甚至都不是有理数,doubles 已经不能精确地处理任意有理数,更不用说无理数了。没有什么特别的理由可以将两个这样有点不精确的数字相除会导致一个精确的数字,尽管它可能会发生。在这种情况下,结果(double十六进制的位)是 0x4008000000000001,而 3 是 0x4008000000000000:它偏离了可能偏离的最小数量。

对于像Log(125, 5)结果这样的确切情况,可以精确计算,但这不是Math.Log试图做的。如果这是你想要的,你可以自己做。

于 2020-09-20T00:03:14.490 回答