在截断过程中将两个数字相乘的问题

时间:2019-01-02 13:56:57

标签: c++ multiplying

我需要在十进制逗号后截断2个十进制数字。 我在C ++中使用以下代码:

auto doubleTmp = value * 100.00;
int64_t tmp = static_cast<int64_t>(doubleTmp);
double res = ( static_cast<double>(tmp) ) /100.00;

但是例如当我将值设置为70.82时,doubleTmp为70.8199999且结果为70.81。有什么更好的方法?为什么?

1 个答案:

答案 0 :(得分:2)

问题是输入value或结果res在计算机内存中都无法正确表示70.82。正如@MatthieuBrucher所建议的那样,您应该使用std::lround;考虑以下代码:

auto value = 70.82;
std::cout << std::fixed << std::setprecision(20) << value << std::endl;

auto tmp = std::lround(value * 100.0);
std::cout << tmp << std::endl;

double res = static_cast<double>(tmp) / 100.00;
std::cout << std::fixed << std::setprecision(20) << res << std::endl;

哪个给出以下输出:

70.81999999999999317879
7082
70.81999999999999317879

但是,您可以将结果存储为一对整数,其中第一个代表整数部分,第二个代表小数部分:

auto res_integral = tmp / 100;
auto res_fractional = tmp % 100;
std::cout << res_integral << "." << res_fractional << std::endl;

或者,只要知道您存储的是 100 * x 而不是 x ,就可以将其存储为tmp