问题
Consider this code:
double result = Math.Sqrt(4746073226998689451);
For result I get 2178548422 instead of 2178548421.999999854etc... How can I get more precise result?
回答1:
For the particular problem, computing the square root, you can use Decimal type and Newton's algorithm:
using System;
class Program
{
public static void Main()
{
long x = 4746073226998689451;
decimal sqrt_x = (decimal)Math.Sqrt(x);
for (int i = 0; i < 10; ++i)
sqrt_x = 0.5m * (sqrt_x + x / sqrt_x);
Console.WriteLine("{0:F16}", sqrt_x);
}
}
The result is:
2178548421.9999998547197773
回答2:
There is a bunch of high precision maths libraries for .NET mentioned on wikipedia - Arbitrary-percision artithmatic page.
I have seen BigNum recommended here before, though the wikipedia link is broken and I can't find the library elsewhere at the moment.
The other option on the page is the C# binding for MPIR.
回答3:
Using digit by digit calculation will give you as many digits as you are looking for.
回答4:
instead of double , try big integer and also check out this link
Big numbers with fraction support
来源:https://stackoverflow.com/questions/8113651/c-sharp-high-precision-calculations