双字符串转换而不会丢失指数部分

时间:2014-01-08 10:59:37

标签: c#

我试图添加两个双号,1234567890123456.00和1.00,总和将存储到字符串中。

结果如下:

  

1234567890123456.00 + 1.00 = 1234567890123457.00

很明显它将以双重形式打印为1.23456789012346E + 15。

但如果我试图通过使用方法ToString(" F")或ToString("#")将其转换为字符串,则结果为1234567890123460.00。我失去7(最后一位数)的地方?

static void Main(string[] args)
{
     double d = 1234567890123456;
     double d2 = 1;
     double d3 = d + d2;

     Console.WriteLine(d3);
     Console.WriteLine(d3.ToString("F"));
}

请帮我纠正代码或找到替代方案。

2 个答案:

答案 0 :(得分:1)

Double类型有15-16 decimal precision digits,你的d值有16位有效十进制数,所以你强调这个限制:

double d = 1234567890123456;

(有效数字的)限制来自mantissa IEEE 754标准中的binary64实际上是15.95个有效十进制数字。

Decimal可能是一个不错的选择。

答案 1 :(得分:0)

static void Main(string[] args)
{
     double d = 1234567890123456;
     double d2 = 1;
     double d3 = d + d2;

     Console.WriteLine(d3);
     Console.WriteLine(d3.ToString("R"));
}

R - 往返解决了我的问题,我得到的预期结果为1234567890123457

Binary floating point and .NET