C++ 将浮点值舍入为小数位数
C++ Rounding float-pointing value to number of fractional digits
我已经试过 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# 版本将 double
舍入到一位小数,C++ 版本将 float
舍入到最接近的整数。
将二进制浮点数四舍五入到固定的小数位数并没有多大意义,因为四舍五入后的数字很可能仍然是一个近似值。例如0.8
不能精确地用二进制浮点数表示。
C++ 舍入函数仅舍入到最接近的整数值,鉴于上述情况,这是一个明智的选择。
您可以使用 std::round(0.850 * 10) / 10
.
恢复 C# 行为(四舍五入到小数点后一位)
请注意,我删除了 f
后缀以匹配 C# double
类型。
我已经试过 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# 版本将 double
舍入到一位小数,C++ 版本将 float
舍入到最接近的整数。
将二进制浮点数四舍五入到固定的小数位数并没有多大意义,因为四舍五入后的数字很可能仍然是一个近似值。例如0.8
不能精确地用二进制浮点数表示。
C++ 舍入函数仅舍入到最接近的整数值,鉴于上述情况,这是一个明智的选择。
您可以使用 std::round(0.850 * 10) / 10
.
请注意,我删除了 f
后缀以匹配 C# double
类型。