解析一个非常大的 double 值会返回错误的值。
例如
Double.Parse("987654321098765432109876543210987.99")
返回9.8765432109876547E+32
,这是错误的。如何处理?
我想在我的网页中用逗号分隔显示上述值。请帮忙。
解析一个非常大的 double 值会返回错误的值。
例如
Double.Parse("987654321098765432109876543210987.99")
返回9.8765432109876547E+32
,这是错误的。如何处理?
我想在我的网页中用逗号分隔显示上述值。请帮忙。
double
精度有限,因此它只会存储您号码的前 15-16 位数字。为了更精确,请使用System.Numerics.BigInteger
- 它不支持非整数,因此您必须自己添加小数点(如果您有固定的小数位数)。
大整数结构
.NET 框架 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,则可能必须在前面插入零。
您可以使用自定义格式
Double.Parse("987654321098765432109876543210987.99").ToString("0,0.00")
输出:"987,654,321,098,765,000,000,000,000,000,000.00"
您还可以下载此实用程序来测试各种形式