C++小数转整数实现异常:三种方法存缺陷,特定数值触发无限循环
小数转整数的实现问题
我尝试将小数转换为整数,测试了三种方法,但都无法完全正常运行,存在以下异常:
- 方法A和方法B分别在数值范围的两端失效;
- 当数组
arr_decimals包含0.14、0.28这类末尾为4或8的小数时,方法C会进入无限循环;将这些数值改为0.17、0.27后,方法C可正常运行。
我已经花了四天时间解决这个问题,但仍未找到解决方案。以下是测试用C++代码,以及方法C的失败、成功控制台输出:
#include <iostream> int main() { // 使用long double以提升扩展性 long double arr_decimals[7]{ 0.02, 0.06, 0.1, 0.14, 0.18, 0.22, 0.28 }; long double arr_pre_values[7]{ 0, 0, 0, 0, 0, 0, 0 }; long double arr_not_values[7]{ 0, 0, 0, 0, 0, 0, 0 }; long double arr_input_values[7]{ 0, 0, 0, 0, 0, 0, 0 }; long double arr_test_values[7]{ 0, 0, 0, 0, 0, 0, 0 }; int var_array_length = 7; int var_int_value = 0; bool bool_more_trailing_zeros = 0; // trial A: std::cout << "trial A:" << std::endl; for (int var_change = 0; var_change < var_array_length; var_change++) { if (arr_decimals[var_change] >= 0.000001 && arr_decimals[var_change] < 0.000009) arr_pre_values[var_change] = arr_decimals[var_change] * 10000000; // 七位小数 else if (arr_decimals[var_change] >= 0.00001 && arr_decimals[var_change] < 0.00009) arr_pre_values[var_change] = arr_decimals[var_change] * 1000000; // 六位... else if (arr_decimals[var_change] >= 0.0001 && arr_decimals[var_change] < 0.0009) arr_pre_values[var_change] = arr_decimals[var_change] * 100000; // 五位... else if (arr_decimals[var_change] >= 0.001 && arr_decimals[var_change] < 0.009) arr_pre_values[var_change] = arr_decimals[var_change] * 10000; // 四位... else if (arr_decimals[var_change] >= 0.01 && arr_decimals[var_change] < 0.09) arr_pre_values[var_change] = arr_decimals[var_change] * 1000; // 三位... else if (arr_decimals[var_change] >= 0.1 && arr_decimals[var_change] < 0.9) arr_pre_values[var_change] = arr_decimals[var_change] * 100; // 两位.. else if (arr_decimals[var_change] < 1) arr_pre_values[var_change] = arr_decimals[var_change] * 10; // 一位.. else std::cout << "Error: unexpected value: " << arr_decimals[var_change] << std::endl; std::cout << "arr_pre_values: " << arr_pre_values[var_change] << std::endl; } std::cout << std::endl; // trial B: std::cout << "trial B:" << std::endl; for (int var_change = 0; var_change < var_array_length; var_change++) { if (arr_decimals[var_change] < 0.000001) arr_not_values[var_change] = arr_decimals[var_change] * 10000000; // 七位小数 else if (arr_decimals[var_change] < 0.000009) arr_not_values[var_change] = arr_decimals[var_change] * 1000000; // 六位... else if (arr_decimals[var_change] < 0.00009) arr_not_values[var_change] = arr_decimals[var_change] * 100000; // 五位... else if (arr_decimals[var_change] < 0.0009) arr_not_values[var_change] = arr_decimals[var_change] * 10000; // 四位... else if (arr_decimals[var_change] < 0.009) arr_not_values[var_change] = arr_decimals[var_change] * 1000; // 三位... else if (arr_decimals[var_change] < 0.09) arr_not_values[var_change] = arr_decimals[var_change] * 100; // 两位.. else if (arr_decimals[var_change] < 1) arr_not_values[var_change] = arr_decimals[var_change] * 10; // 一位.. else std::cout << "Error: unexpected value: " << arr_decimals[var_change] << std::endl; std::cout << "arr_not_values: " << arr_not_values[var_change] << std::endl; } std::cout << std::endl; // trial C: std::cout << "trial C:" << std::endl; std::copy(std::begin(arr_decimals), std::end(arr_decimals), std::begin(arr_input_values)); for (int var_change = 0; var_change < var_array_length; var_change++) { bool_more_trailing_zeros = 1; while (bool_more_trailing_zeros) { std::cout << "arr_input_values: " << arr_input_values[var_change] << std::endl; var_int_value = static_cast<long double>(arr_input_values[var_change]); std::cout << "var_int_value: " << var_int_value << std::endl; // 比较long double与int if (arr_input_values[var_change] != var_int_value) { arr_input_values[var_change] *= 10; } // 保存值并结束循环 else // if (arr_input_values[var_change] == var_int_value) { arr_test_values[var_change] = arr_input_values[var_change]; bool_more_trailing_zeros = 0; } } std::cout << typeid(var_int_value).name() << " --------->> " << "arr_test_values: " << arr_test_values[var_change] << std::endl; } return 0; }
方法C失败时的控制台输出
arr_pre_values: 20 arr_pre_values: 60 arr_pre_values: 10 arr_pre_values: 14 arr_pre_values: 18 arr_pre_values: 22 arr_pre_values: 28 arr_not_values: 2 arr_not_values: 6 arr_not_values: 1 arr_not_values: 1.4 arr_not_values: 1.8 arr_not_values: 2.2 arr_not_values: 2.8 arr_input_values: 0.02 var_int_value: 0 arr_input_values: 0.2 var_int_value: 0 arr_input_values: 2 var_int_value: 2 int --------->> arr_test_values: 2 arr_input_values: 0.06 var_int_value: 0 arr_input_values: 0.6 var_int_value: 0 arr_input_values: 6 var_int_value: 6 int --------->> arr_test_values: 6 arr_input_values: 0.1 var_int_value: 0 arr_input_values: 1 var_int_value: 1 int --------->> arr_test_values: 1 arr_input_values: 0.14 var_int_value: 0 arr_input_values: 1.4 var_int_value: 1 arr_input_values: 14 var_int_value: 14 arr_input_values: 140 var_int_value: 140 arr_input_values: 1400 var_int_value: 1400 arr_input_values: 14000 var_int_value: 14000 arr_input_values: 140000 var_int_value: 140000 arr_input_values: 1.4e+06 var_int_value: 1400000 arr_input_values: 1.4e+07 var_int_value: 14000000 arr_input_values: 1.4e+08 var_int_value: 140000000 arr_input_values: 1.4e+09 var_int_value: 1400000000 ...直至溢出到INF
方法C成功时的控制台输出
arr_input_values: 0.02 var_int_value: 0 arr_input_values: 0.2 var_int_value: 0 arr_input_values: 2 var_int_value: 2 int --------->> arr_test_values: 2 arr_input_values: 0.06 var_int_value: 0 arr_input_values: 0.6 var_int_value: 0 arr_input_values: 6 var_int_value: 6 int --------->> arr_test_values: 6 arr_input_values: 0.1 var_int_value: 0 arr_input_values: 1 var_int_value: 1 int --------->> arr_test_values: 1 arr_input_values: 0.17 var_int_value: 0 arr_input_values: 1.7 var_int_value: 1 arr_input_values: 17 var_int_value: 17 int --------->> arr_test_values: 17 arr_input_values: 0.18 var_int_value: 0 arr_input_values: 1.8 var_int_value: 1 arr_input_values: 18 var_int_value: 18 int --------->> arr_test_values: 18 arr_input_values: 0.22 var_int_value: 0 arr_input_values: 2.2 var_int_value: 2 arr_input_values: 22 var_int_value: 22 int --------->> arr_test_values: 22 arr_input_values: 0.27 var_int_value: 0 arr_input_values: 2.7 var_int_value: 2 arr_input_values: 27 var_int_value: 27 int --------->> arr_test_values: 27
内容的提问来源于stack exchange,提问作者Retro Epiphany
相关产品推荐
相关产品推荐

