c++ - 如何在不丢失 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.16
(2.16000000
float
或)?2.1600000000000000
double
我需要某些计算的确切值,所以我不需要将其打印为2.16
,我需要确切的数字。
解决方案
如何在不丢失 C++ 精度的情况下将字符串转换为双精度或浮点数
通过仅转换可以在目标类型中精确表示的值。
是否可以将“2.16”转换为实际值 2.16(浮点或双精度)
不,因为这些类型中不存在实际值 2.16(假设二进制 IEEE-754 表示)。可以实现的最佳结果是转换为最接近 2.16 的可表示值。
我需要一些计算的确切值
如果这是真的,那么您不需要使用浮点数。浮点数只能在精度误差可以接受的情况下使用。
我至少可以得到不小于原始数字的转换吗
如果您相应地设置舍入模式,您确实可以:
std::fesetround(FE_UPWARD);