算术,以获得正确的十进制数,而不是 c++ 中的指数数

Arithmetic to get correct decimal number instead of exponential number in c++

本文关键字:c++ 数数 指数 十进制数 算术      更新时间:2023-10-16
int digit = 1;
float result=0.0;
double temp = 200000;
float tick = 0.00100000005;
result = digit/1000000.0;
long long phase = temp*result*1000/tick*1000

结果将等于 9.999999997E-07。如果手动计算,它应该是 0.000001如何使指数位数为 0.000001?谢谢。

如果结果 = 9.99999997E-07 阶段计算将为 199999,但如果结果 = 0.000001 计算的相位将为 200000。所以我的问题是结果。

加入

对于金融和某些其他用途,最简单的方法是以最小单位的倍数工作......在您的示例中,它可能是"微米":

inline long long units_to_microns(long long units) { return units * 1000000; }
long long digit = units_to_microns(1);
long long result = digit / 1000000;

然后编写一些自定义代码,将数字打印到所需的小数点:

std::string microns_to_string(long long microns)
{
    std::ostringstream oss;
    oss << microns / 1000000;
    if (microns % 1000000)
        oss << '.' << std::setfill('0') << std::setw(6) << microns;
    return oss.str();
}

一种更结构化(和可靠)的方式来做到这一点是由提升单位库提供的。 这样,您可以指定特定变量的单位,例如,如果一个以米为单位,另一个以公里为单位,则可以添加它们而无需任何特别小心。

如果你正在处理无理数,并且尽早将它们四舍五入到特定的精度是没有用的,那么你最好使用double(对于一些更有效的精度数字),或者像GMP这样的自定义库 - GNU多精度算术库。

顺便说一句 - 每个计算机科学家都应该知道的关于浮点运算的知识是这个领域的推荐阅读。

您不能,因为数字 1/1000000.0 无法以二进制准确表示。您可以使用double提高准确性。这种类型的问题在这里很常见。我发现这个链接很有帮助:

https://docs.python.org/2/tutorial/floatingpoint.html

(这是针对 Python 的,但问题是相同的)。