精確表達浮點數

來源:互聯網
上載者:User

在電腦中,使用float或者double來儲存小數是不能得到精確值的。如果你希望得到精確計算結果,最好是用分數形式來表示小數。有限小數或者無限迴圈小數都可以轉化為分數。比如:

0.9=9/10

0.333(3)=1/3(括弧中的數字表示是迴圈節)

當然一個小數可以用好幾種分數形式來表示。如:

0.333(3)=1/3=3/9

給定一個有限小數或者無限迴圈小數,你能否以分母最小的分數形式來返回這個小數呢?如果輸入為迴圈小數,迴圈節用括弧標記出來。下面是一些可能的輸入資料,如0.3、0.30、0.3(000)、0.3333(3333)、……

 分析與解法

拿到這樣一個問題,我們往往會從最簡單的情況入手,因為所有的小數都可以分解成一個整數和一個純小數之和,不妨只考慮大於0,小於1的純小數,而且暫時不考慮分子和分母的約分,先設法將其表示為分數形式,然後再進行約分。題目中輸入的小數,要麼為有限小數X=0.a1a2…an,要麼為無限迴圈小數X=0.a1a2…an(b1b2…bm),X的表示式中的字母a1a2…an,b1b2…bm都是0~9的數字,括弧部分(b1b2…bm)表示迴圈節,我們需要處理的就是以上兩種情況。

對於有限小數X=0.a1a2…an來說,這個問題比較簡單,X就等於(a1a2…an)/10^n。 

對於無限迴圈小數X=0.a1a2…an(b1b2…bm)來說,其複雜部分在於小數點後同時有非迴圈部分和迴圈部分,我們可以做如下的轉換:

X=0.a1a2…an(b1b2…bm)

=>10^n*X=a1a2…an.(b1b2…bm)

=>10^n*X=a1a2…an+0.(b1b2…bm)

=>X=(a1a2…an+0.(b1b2…bm))/10^n 

對於整數部分a1a2…an,不需要做額外處理,只需要把小數部分轉化為分數形式再加上這個整數即可。對於後面的無限迴圈部分,可以採用如下方式進行處理: 

令Y=0.b1b2…bm,那麼

10^m*Y=b1b2…bm.(b1b2…bm)

=>10^m*Y=b1b2…bm+0.(b1b2…bm)

=>10^m*Y-Y=b1b2…bm

=>Y=b1b2…bm/(10^m-1) 

將Y代入前面的X的等式可得:

X=(a1a2…an+Y)/10^n

=(a1a2…an+b1b2…bm/(10^m-1))/10^n

=((a1a2…an)*(10^m-1)+(b1b2…bm))/((10^m-1)*10^n) 

至此,便可以得到任意一個有限小數或無限迴圈小數的分數表示,但是此時分母未必是最簡的,接下來的任務就是讓分母最小,即對分子和分母進行約分,這個相對比較簡單。對於任意一個分數A/B,可以簡化成(A/Gcd(A,B))/(B/Gcd(A,B)),其中Gcd函數為求A和B的最大公約數,這就涉及本書中的演算法(2.7節“最大公約數問題”),其中有很巧妙的解法,請讀者閱讀具體的章節,這裡就不再贅述。 

綜上所述,先求得小數的分數表示方式,再對其分子分母進行約分,便能夠得到分母最小的分數表現形式。 

例如,對於小數0.3(33),根據上述方法,可以轉化為分數:

0.3(33)

=(3*(10^2-1)+33)/((10^2-1)*10)

=(3*99+33)/990

=1/3

 

對於小數0.285714(285714),我們也可以算出:

0.285714(285714)

=(285714*(10^6-1)+285714)/((10^6-1)*10^6)

=(285714*999999+285714)/999999000000

=285714/999999

=2/7

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.