浮点数不准确

问题描述 投票:1回答:2

我有一个字符串

strValue = "11.900000"

我想将其解析为浮点值。所以我尝试了:

float fValue = -1;
sscanf_s(strValue.c_str(), "%f", &fValue);

try
{
    double test = std::stod(strValue, &sz);
    fValue = (float) std::stod(strValue, &sz);
}
catch (...)
{
    fValue = -1;
}

对于double,它是准确的:

test = 11.900000000000000

对于float,这是不准确的:

fValue = 11.8999996

是否有可能准确地做到这一点? (我知道在使用浮点数时存在误差,但是有更好的方法吗?)

c++ precision floating-accuracy floating-point-conversion
2个回答
2
投票

11.8999996值是11.9的最精确近似值,可以用float类型表示。


2
投票

对于或任何其他二进制浮点类型,它是not正确。只要在小数点后打印更多数字,您很快就会开始看到“垃圾”数字

唯一的方法是使用decimal floating-point类型。如果您的平台具有FLT_RADIX == 10,则可以直接使用内置的FLT_RADIX == 10,但是显然不是您的情况,并且我不知道任何使用十进制浮点数float的当前系统。

因此您需要为此使用自定义类型。您可以使用某些[-C0]或except IBM z-series等IEEE-754十进制32库。或者,如果您使用gcc,则它已经通过Intel® Decimal Floating-Point Math Library类型具有libdfp

您可以在此问题中找到更多信息support for decimal float

© www.soinside.com 2019 - 2024. All rights reserved.