#50349: c++不使用浮點數用string硬幹出來


SeaFoodInspector (海鮮稽查長)

學校 : 臺北市立建國高級中學
編號 : 314161
來源 : [220.135.3.72]
最後登入時間 :
2025-10-12 00:42:26

電腦在判斷浮點數會有誤差,所以真的想不到可以看我的屎山代碼沒關係,但記得在下面回復你有用<3

#include <iostream>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    string s;
    while (cin >> s)
    {
        int pt = s.size() + 3;/*先假設沒有小數點,所以把小數第三位在字串的位置先標出來*/
       
        bool temp = 0;
        for (int i = 1 ; i < s.size() ; i++)/*找小數後第三位在字串中的位置(如果本來輸入的數字有的話)*/
            if (s[i] == '.')
            {
                pt = i + 3;
                temp = 1;
                break;
            }

        if (temp == 0)/*沒有小數點的話,就把小數點的點加進去*/
            s += '.';

        if (pt >= s.size())/*把字串補足0到小數第三位的*/
            {
                int size = s.size();
                for (int i = size ; i <= pt ; i++)
                    s += '0';
            }    

        temp = 0;
        if (s[0] == '-')/*判斷正負*/
            temp = 1;

        if (temp == 0)/*如果為正*/
        {
            if (s[pt] > '4')/*四捨五入*/
                s[pt - 1]++;
               
            for (int i = pt - 1 ; i >= 1 ; i--)/*判斷是否進位*/
                if (s[i] > '9')
                {
                    s[i] = '0';

                    if (s[i - 1] == '.')
                        s[i - 2]++;
                    else
                        s[i - 1]++;
                }
           
            if (s[0] > '9')/*判斷最大位數是否要進位(不在上面的迴圈做是因為可能i=-1為非法範圍)*/
            {
                s[0] = '0';
                s = '1' + s;
            }
        }

        else/*如果為負*/
        {
            if (s[pt] > '4')
                s[pt - 1]++;
               
            for (int i = pt - 1 ; i >= 2 ; i--)
                if (s[i] > '9')
                {
                    s[i] = '0';

                    if (s[i - 1] == '.')
                        s[i - 2]++;
                    else
                        s[i - 1]++;
                }
           
            if (s[1] > '9')/*一樣對最大位數進位,但要把負號加回去*/
            {
                s[1] = '0';
                s[0] = '1';
                s = '-' + s;
            }
        }

        temp = 0;
        for (int i = 0 ; i < pt ; i++)/*判斷是否不全為 - 0 , 這三個符號*/
            if (s[i] != '-' and s[i] != '0' and s[i] !='.')
            {
                temp = 1;
                break;
            }

        if (temp == 0)/*如果全為 - 0 , 這三個符號就忽略負號直接輸出0.00 */
        {
            for (int i = 0 ; i < pt ; i++)
                if (s[i] != '-')
                    cout << s[i];
        }
        else/*正常輸出情況*/
            for (int i = 0 ; i < pt ; i++)
                cout << s[i];

        cout << '\n';
    }

    return 0;
}