【问题标题】:C++ Rounding float-pointing value to number of fractional digitsC ++将浮点值舍入为小数位数
【发布时间】:2020-02-25 07:58:33
【问题描述】:

我已经尝试过 std::round 但它并没有给我我想要的结果。所以我的问题是我有 C# 程序,我正在转换为 C++,我遇到了这个问题。 C# Math.round 和 C++ round 是不同的。所以这会导致错误的计算。 C#代码:

Console.WriteLine(Math.Round(0.850, 1));

输出:

0,8

C++ 代码:

 std::cout << roundf(0.850f) << std::endl;

输出:

1

就像您看到的那样,它们是不同的。我该如何解决这个问题?

【问题讨论】:

  • 在 C++ 中,函数 roundf() 向零舍入。这与 C# Math.Round 函数的作用完全不同。你不能仅仅因为它们的名字相似就假设不同编程语言中的两个函数做同样的事情。尝试阅读文档。

标签: c++ rounding digits


【解决方案1】:

C# 版本将double 舍入到小数点后一位,C++ 版本将float 舍入到最接近的整数。

将二进制浮点数四舍五入到固定的小数位数实际上并没有多大意义,因为四舍五入后的数字仍然很可能是一个近似值。例如0.8 不能用二进制浮点数精确表示。

C++ 舍入函数只舍入到最接近的整数值,鉴于上述情况,这是一个明智的选择。

您可以使用 std::round(0.850 * 10) / 10 恢复 C# 行为(四舍五入到小数点后 1 位)。

请注意,我删除了 f 后缀以匹配 C# double 类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 2012-11-08
    • 2019-08-20
    相关资源
    最近更新 更多