這個問題困擾了我不少時間,最近有個比較清晰的認識,和大家分享。
這個問題首先要從數字表示法說起。今天我們看到的123這樣的十進位制數,是自然而然的理解其意義,但是有沒有深究其內在的數學原理呢?
所謂十進位制是0~9十個基本符號為基礎的一種數字表示法,數字表示法是將一串基本符號從左到右連續排列的一種方法。為什麼12時表示一十二,而不是二十一,或者是一加二的意思呢?因為數字所處的位置是有特別意義的,最右邊第乙個數字符號,代表基本的數0~9,而第二位的意義並不是0~9,而是0*10~9*10。推而廣之,百位是x*100,(x是符號),用簡練的數學公式就是x*10^k , 個位k是0,十位是1,百位k是2,從右到左一直數下去。123的意思就是1*10^2+2*10^1+3*10^0。
位置,進製,符號這三者的關係就是「123」這種數字表示法內在的數學原理。
那麼,0.1 是什麼意思?是1*10^-1,向右數數的結果。小數點是為了區分個位的位置在**。
乙個數要用「數字表示法」表示出來,必然需要能夠化為x*10^k的形式,而並不是任意數都能夠做到。從數字法小數的定義看可以得知,乙個數要能夠被表示出來,需要能除盡10,才有若干個x*10^k 的數字組合表示它,否則就是無數個符號才能表示。如1/3這個數除以10等於1/3*1/10 = 0.0333333….迴圈小數。
究竟哪些數可以用十進位制表示哪些不可以?如分母是10的因子和因子的合數,如1,2,5,10,20,50等(整數分母為1,而任意大於1的數的因子都有1和自身,因此整數可以用任意數制精確表示)。
回答題目,為什麼0.1無法被二進位制小數表示,0.1即1/10這個數要轉換成二進位制即x*2^k的組合數,必須要除盡2.要注意,2進製只有0,1兩個符號,另乙個需要注意,二進位制被除數右移一位等於*2,而非10進製的*10。
1/10*1/2 = 1/20
1*2*2*2*2 = 32 右移4位
-20 = 12 商1
12*2 = 24 右移1位
-20 = 4 商1
4*2*2*2 =32 右移3位
-20 = 12 商1 可見數字重複了,迴圈小數無疑
即 0.00011001。
那麼2進製能夠表示哪些十進位制小數,5/10,因為能約成1/2,分母是2的因子。
總結一點,就是位置表示法有其自身的缺陷,並不能在有限的數字,表示眾多有理數,這個時候,需要借助分數來幫忙,來避免位置表示法以固定數作分母這個缺點。
如果需要乙個可以避免迴圈小數的數制,不妨試用210進製,因為因子比較多,2*3*5*7 =210.
二進位制小數
要理解這道題,首先要知道什麼樣的小數可以轉化為二進位制形式,怎樣的小數不能被轉化為二進位制形式,自己測試幾組資料發現 1.可以轉化為二進位制的小數在有限次的乘二之後,小數部分會變零。舉個例子 0.625 2 1.25 1.25 2 2.5 2.5 2 5.0 5.0的小數部分變成了 0 2.不能轉化...
小數 二進位制
首先,給出乙個任意實數,整數部分用普通的二進位制便可以表示,這裡只說小數部分如何表示 例如0.6 文字描述該過程如下 將該數字乘以2,取出整數部分作為二進位制表示的第1位 然後再將小數部分乘以2,將得到的整數部分作為二進位制表示的第2位 以此類推,知道小數部分為0。特殊情況 小數部分出現迴圈,無法停...
二進位制小數
題目描述 有乙個介於0和1之間的實數,型別為double,返回它的二進位制表示。如果該數字無法精確地用32位以內的二進位制表示,返回 error 給定乙個double num,表示0到1的實數,請返回乙個string,代表該數的二進位制表示或者 error 測試樣例 0.625 返回 0.101 c...