解析一个非常大的双值会返回错误的值。
例如
Double.Parse("987654321098765432109876543210987.99")
返回9.8765432109876547E+32
,这是错误的。怎么办呢?
我想在网页中以逗号分隔显示上述值。请帮助。
答案 0 :(得分:3)
将double
转换为string
时,您需要指定format。默认情况下,它使用scientific notation表示大数字,这不是公共网站的最佳选择。我在示例中使用了F
,但请考虑阅读 msdn 以查找最符合您需求的格式
var str = Double.Parse("987654321098765432109876543210987.99").ToString("F");
Console.WriteLine (str);
打印
987654321098765000000000000000000.00
答案 1 :(得分:2)
double
精度有限,因此它只会存储您号码的前15-16位数字。为了更加精确,请使用System.Numerics.BigInteger
- 它不支持
虽然非整数,所以你必须自己添加小数点(如果你有
固定的小数位数。)
BigInteger结构
.NET Framework 4.0 +
表示任意大的有符号整数。
(资料来源:http://msdn.microsoft.com/en-us/library/dd268287%28v=vs.99%29.aspx)
相关功能:
<强>解析强>
将数字的字符串表示形式转换为其BigInteger 等效。
命名空间:System.Numerics
程序集:System.Numerics(在System.Numerics.dll中)
public static BigInteger Parse(string value)
(资料来源:http://msdn.microsoft.com/en-us/library/dd268231%28v=vs.100%29.aspx)
示例:
import System.Numerics.BigInteger;
BigInteger.Parse("98765432109876543210987654321098999").ToString(); // note, no dot
您还需要引用System.Numerics程序集。
如果需要在数字中包含一些固定的小数位数,您可以自己实现定点运算和I / O.在这个例子中,我将使用两个小数位,但它可以 很容易修改。
关键是不能使用原始数字,而是使用原始数字的倍数。例如,
如果您的号码为X
,则其内部表示为X * 100
无需修改的加法和减法工作。我们考虑数字X,Y和Z, 和他们的内部陈述:
X + Y = Z
X*100 + Y*100 = Z*100
两个方程都是正确的。
乘法和除法需要一些算术。让我们修改前面的例子 乘法:
X * Y = Z
(X*100) * (Y*100) = Z*100 <--- WRONG
您需要稍微修改一下等式:
X * Y = Z
(X*100) * (Y*100) = Z*100*100
Z * 100 = (X*100) * (Y*100) / 100
因此,您需要将结果除以100以获得正确的内部表示。 使用除法,您需要将两个操作数分别乘以100。
如果您的输入始终包含两位小数,则可以删除小数 指向获取该数字的内部表示。自由格式输入需要 更多的工作。
在输出中,您必须在最后两位数之前注入小数点 得到正确的输入。此外,如果数字小于0,您可能必须 在前面插入零。
答案 2 :(得分:1)
您可以使用custom format
Double.Parse("987654321098765432109876543210987.99").ToString("0,0.00")
输出:"987,654,321,098,765,000,000,000,000,000,000.00"