【发布时间】:2016-09-28 05:55:53
【问题描述】:
请看这两个简单的代码和输出的区别。
using System;
namespace _02.CircleArea
{
class CircleArea
{
static void Main(string[] args)
{
double inputR = double.Parse(Console.ReadLine());
double circleArea = Math.Round((Math.PI * inputR * inputR), 12);
Console.WriteLine("{0}", circleArea);
}
}
}
输入为 123.456,输出为 47882.2198038791
而这样做的方式:
using System;
namespace _02.CircleArea
{
class CircleArea
{
static void Main(string[] args)
{
double inputR = double.Parse(Console.ReadLine());
double circleArea = (Math.PI * inputR * inputR);
Console.WriteLine("{0:F12}", circleArea);
}
}
}
使用相同的输入 123.456 它给出不同的输出 47882.219803879100
为什么占位符舍入和 Math.Round 舍入结果之间存在差异?
【问题讨论】:
-
@CodeCaster:这里没有观察到该问题中讨论的差异。
-
您从 {0} 获得的默认格式可确保显示的结果不超过 15 个有效数字。因为显示更多是无意义的,所以 double 类型不能存储那么多数字。它使用 53 位作为尾数,只允许表达 2^53 个不同的值。当您使用 F12 时,您会覆盖废话规则并获得 17 位数字。最后两个只是随机噪音,你很不幸他们是0。这可能会发生,这是一个意外。
标签: c# rounding placeholder difference