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

时间:2014-04-08 05:59:33

标签: c++

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.99999997e-07。如果手动计算它应该是0.000001 如何使指数num为0.000001? 感谢。

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

加入

2 个答案:

答案 0 :(得分:2)

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

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();
}

boost Units library提供了一种更加结构化(可靠)的方法。这样,您可以指定特定变量的单位,例如,一个是米和另一公里,你可以不加任何特别的照顾添加它们。

如果你正在处理irrational numbers并在早期将它们四舍五入到一个特定的精度是没用的,那么你最好使用double(对于一些更重要的精度数字)或自定义库,如GMP - the GNU Multiple Precision Arithmetic Library

BTW - What Every Computer Scientist Should Know About Floating-Point Arithmetic通常建议在此空间阅读。

答案 1 :(得分:0)

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

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

(它适用于Python,但问题是相同的)。