首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C#中格式化输出的双精度

在C#中格式化输出的双精度
EN

Stack Overflow用户
提问于 2009-09-14 13:23:38
回答 8查看 133K关注 0票数 67

运行一个与Is double Multiplication Broken in .NET?相关的快速实验,并阅读了几篇关于C#字符串格式化的文章,我认为这是:

代码语言:javascript
运行
复制
{
    double i = 10 * 0.69;
    Console.WriteLine(i);
    Console.WriteLine(String.Format("  {0:F20}", i));
    Console.WriteLine(String.Format("+ {0:F20}", 6.9 - i));
    Console.WriteLine(String.Format("= {0:F20}", 6.9));
}

将是这段C代码的C#等价物:

代码语言:javascript
运行
复制
{
    double i = 10 * 0.69;

    printf ( "%f\n", i );
    printf ( "  %.20f\n", i );
    printf ( "+ %.20f\n", 6.9 - i );
    printf ( "= %.20f\n", 6.9 );
}

但是,C#会生成以下输出:

代码语言:javascript
运行
复制
6.9
  6.90000000000000000000
+ 0.00000000000000088818
= 6.90000000000000000000

尽管我在调试器中显示的值等于6.89999999999999946709 (而不是6.9)。

与C相比,C显示了格式所要求的精度:

代码语言:javascript
运行
复制
6.900000                          
  6.89999999999999946709          
+ 0.00000000000000088818          
= 6.90000000000000035527          

到底怎么回事?

(MicrosoftStudioFrameworkV3.51 SP1 / .NET C# 2008速成版)

我有数值计算的背景,并有在各种平台上实现区间算术的经验。区间算术是一种用于估计由于复杂数值系统的精度限制而产生的误差的技术。要获得奖金,不要试图解释存储精度-在这种情况下,它是64位双精度的一个ULP的差异。

要获得奖励,我想知道.Net如何(或是否)将一个双精度值格式化为在C代码中可见的所需精度。

EN

Stack Overflow用户

发布于 2009-09-14 14:23:08

看看这个MSDN reference。在注释中,它指出数字将四舍五入为所要求的小数位数。

如果你使用"{0:R}“,它将产生一个被称为”往返“的值,看看这个MSDN reference获取更多信息,这是我的代码和输出:

代码语言:javascript
运行
复制
double d = 10 * 0.69;
Console.WriteLine("  {0:R}", d);
Console.WriteLine("+ {0:F20}", 6.9 - d);
Console.WriteLine("= {0:F20}", 6.9);

输出

代码语言:javascript
运行
复制
  6.8999999999999995
+ 0.00000000000000088818
= 6.90000000000000000000
票数 10
EN
查看全部 8 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1421520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档