【问题标题】:Why is that difference between Math.Round rounding and placeholder rounding in C#?为什么在 C# 中 Math.Round 舍入和占位符舍入之间存在差异?
【发布时间】: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


【解决方案1】:

Math.Round 实际上给你一个新的数值,而使用格式代码只是显示一个四舍五入的值。由于您在第二个格式字符串而不是第一个格式字符串中指定了 12 位精度,因此它会为您提供尾随零。

我会注意到,数字格式总是从零开始舍入,而Math.Round 默认情况下会舍入到最近的偶数

【讨论】:

    【解决方案2】:

    两者的舍入完全相同。不同之处在于尾随零的显示。由于在第一个代码 sn-p 中,有效数字的数量仅用于舍入并且不适用于字符串格式化例程,因此您没有得到尾随零也就不足为奇了。

    【讨论】:

    • @DStanley:这将与其他输入一起出现。 使用这些输入,使用这两个函数进行舍入完全相同。所问的问题是关于这些输入的行为,即尾随零或缺少尾随零。
    • 好的,我明白你的意思了。删除了我的评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多