C# Log(125,5)在C中不返回3#

C# Log(125,5)在C中不返回3#,c#,.net,C#,.net,为什么 返回4.44089209850063E-16根据,Math.Log的重要部分如下所示: var test = Math.Log(125,5); Console.WriteLine(test % 1); 其中,单参数Log计算自然对数。这是实现不同基数的浮点对数的自然方法。自然对数在一般情况下当然不是精确的,它们中的大多数甚至不是有理数,doubles已经不能精确地处理任意有理数,更不用说无理数了。没有特别的理由认为两个如此不精确的数字之间的除法会得到一个精确的数字,尽管这是可能发生的

为什么

返回
4.44089209850063E-16

根据,Math.Log的重要部分如下所示:

var test = Math.Log(125,5);
Console.WriteLine(test % 1); 
其中,单参数
Log
计算自然对数。这是实现不同基数的浮点对数的自然方法。自然对数在一般情况下当然不是精确的,它们中的大多数甚至不是有理数,
double
s已经不能精确地处理任意有理数,更不用说无理数了。没有特别的理由认为两个如此不精确的数字之间的除法会得到一个精确的数字,尽管这是可能发生的。在这种情况下,结果(十六进制中的双精度位)为0x40080000000001,而3为0x40080000000000:它的关闭量尽可能小


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

双精度浮点的精度为,因此对于单位范围内的结果而言,
E-16
顺序的错误并非意外。和
return (Log(a)/Log(newBase));