解析大双值C#

时间:2013-03-20 10:03:41

标签: c# .net floating-point

解析一个非常大的双值会返回错误的值。

例如

Double.Parse("987654321098765432109876543210987.99") 

返回9.8765432109876547E+32,这是错误的。怎么办呢?

我想在网页中以逗号分隔显示上述值。请帮助。

3 个答案:

答案 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"

您也可以下载此utility to test various forma