首页 > 解决方案 > 如何在不丢失 C++ 精度的情况下将字符串转换为双精度或浮点数

问题描述

我正在尝试将字符串转换为 C++ 中的双精度或浮点数,但结果并不准确。例如:

double d1 = stod("2.16"); //d1 ends up being 2.1600000000000001

float f1 = stof("2.16"); //f1 ends up being 2.16000009

是否可以使用 C++ 库转换"2.16"为实际值2.162.16000000 float或)?2.1600000000000000 double我需要某些计算的确切值,所以我不需要将其打印为2.16,我需要确切的数字。

标签: c++doubleprecision

解决方案


如何在不丢失 C++ 精度的情况下将字符串转换为双精度或浮点数

通过仅转换可以在目标类型中精确表示的值。

是否可以将“2.16”转换为实际值 2.16(浮点或双精度)

不,因为这些类型中不存在实际值 2.16(假设二进制 IEEE-754 表示)。可以实现的最佳结果是转换为最接近 2.16 的可表示值。

我需要一些计算的确切值

如果这是真的,那么您不需要使用浮点数。浮点数只能在精度误差可以接受的情况下使用。


我至少可以得到不小于原始数字的转换吗

如果您相应地设置舍入模式,您确实可以:

std::fesetround(FE_UPWARD);

推荐阅读