c++ 将小数更改为整数

5n0oy7gb  于 2022-11-19  发布在  其他
关注(0)|答案(1)|浏览(322)

请原谅我的n 00 b问题:p
我在试着把小数转换成整数。
因此,到目前为止,我已经找到了三种有效的方法和几种无效的方法。
这似乎很奇怪:
A:试验A和B在光谱的相反两端失败。
B:如果我改变数组arr_decimals[7]中的值'0.14'和'0.28',那么试验C就可以工作。任何在这两个索引中有'4'或'8'的值都失败!几乎任何其他值都可以工作。
从字面上看,只是把“14”改为“17”,把“28”改为“27”......哈哈,结束了?
我已经为这三个解决方案挣扎了四天,但没有一个完全有效。我感觉好像我在逻辑上出现了一些n 00 b错误。另外,请原谅我的代码格式,下面,这是我在stackoveflow上的第一篇文章。

#include <iostream>

int main()
{
    // long doubles for scalablility
    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;       // seven decimals places
        else if (arr_decimals[var_change] >= 0.00001 && arr_decimals[var_change] < 0.00009)     arr_pre_values[var_change] = arr_decimals[var_change] * 1000000;        // six ...
        else if (arr_decimals[var_change] >= 0.0001 && arr_decimals[var_change] < 0.0009)       arr_pre_values[var_change] = arr_decimals[var_change] * 100000;         // five ...
        else if (arr_decimals[var_change] >= 0.001 && arr_decimals[var_change] < 0.009)         arr_pre_values[var_change] = arr_decimals[var_change] * 10000;          // four ...
        else if (arr_decimals[var_change] >= 0.01 && arr_decimals[var_change] < 0.09)           arr_pre_values[var_change] = arr_decimals[var_change] * 1000;           // three ...
        else if (arr_decimals[var_change] >= 0.1 && arr_decimals[var_change] < 0.9)             arr_pre_values[var_change] = arr_decimals[var_change] * 100;            // two ..
        else if (arr_decimals[var_change] < 1)                                                  arr_pre_values[var_change] = arr_decimals[var_change] * 10;             // one ..
        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;       // seven decimals places
        else if (arr_decimals[var_change] < 0.000009)   arr_not_values[var_change] = arr_decimals[var_change] * 1000000;        // six ...
        else if (arr_decimals[var_change] < 0.00009)    arr_not_values[var_change] = arr_decimals[var_change] * 100000;         // five ...
        else if (arr_decimals[var_change] < 0.0009)     arr_not_values[var_change] = arr_decimals[var_change] * 10000;          // four ...
        else if (arr_decimals[var_change] < 0.009)      arr_not_values[var_change] = arr_decimals[var_change] * 1000;           // three ...
        else if (arr_decimals[var_change] < 0.09)       arr_not_values[var_change] = arr_decimals[var_change] * 100;            // two ..
        else if (arr_decimals[var_change] < 1)          arr_not_values[var_change] = arr_decimals[var_change] * 10;             // one ..
        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;

            // compare long double to int
            if (arr_input_values[var_change] != var_int_value)
            {
                arr_input_values[var_change] *= 10;
            }
            // move value and end loop
            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;
}

控制台打印输出失败:

>! 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
>! to INF and beyond!

试验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
nfs0ujit

nfs0ujit1#

小数是不精确的。如果您只是做简单的加法和减法,并且需要精确的数字,您可以使用数组来分别储存小数和整数。

相关问题