You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 15:30:53