【发布时间】:2020-01-17 05:39:17
【问题描述】:
这是一段示例代码,其中包含来自 .net core 2.2 和 3.1 的输出。它显示了基本浮点表达式 a^b 的不同计算结果。
在此示例中,我们计算 1.9 的 3 次方。以前的 .NET 框架产生了正确的结果,但 .net core 3.0 和 3.1 产生了不同的结果。
这是有意更改吗?我们如何将财务计算代码迁移到新版本,同时保证数值计算仍会产生相同的结果? (如果 .NET 也有十进制数学库就好了)。
public static class Program
{
public static void Main(string[] args)
{
Console.WriteLine("--- Decimal ---------");
ComputeWithDecimalType();
Console.WriteLine("--- Double ----------");
ComputeWithDoubleType();
Console.ReadLine();
}
private static void ComputeWithDecimalType()
{
decimal a = 1.9M;
decimal b = 3M;
decimal c = a * a * a;
decimal d = (decimal) Math.Pow((double) a, (double) b);
Console.WriteLine($"a * a * a = {c}");
Console.WriteLine($"Math.Pow((double) a, (double) b) = {d}");
}
private static void ComputeWithDoubleType()
{
double a = 1.9;
double b = 3;
double c = a * a * a;
double d = Math.Pow(a, b);
Console.WriteLine($"a * a * a = {c}");
Console.WriteLine($"Math.Pow(a, b) = {d}");
}
}
.NET Core 2.2
--- 十进制 ---------
a * a * a = 6.859
Math.Pow((double) a, (double) b) = 6.859
--- 双 ----------
a * a * a = 6.859
Math.Pow(a, b) = 6.859
.NET Core 3.1
--- 十进制 ---------
a * a * a = 6.859
Math.Pow((double) a, (double) b) = 6.859
--- 双 ----------
a * a * a = 6.858999999999999
Math.Pow(a, b) = 6.858999999999999
【问题讨论】:
-
在 .NET Core 3.1 中有很多记录在案的浮点改进。请使问题更具可读性。原始值和预期值是什么?为什么预期值被认为是正确的?
-
旧结果有一点点错误。实际的双精度值是相同的,但旧的字符串格式化程序生成的字符串相差一位
-
是的。 1.9 ^ 3 正好是 6.859。带有示例和链接的公认答案帮助我解决了问题。
标签: c# .net-core-3.1 .net-core-3.0 c#-8.0 .net-core-2.2