小數至分數計算器 更新 106,07,29
更新 106,07,12 把 parseInt(i0*aa+addone) 改為 parseInt(n2)+addone

訪問時間:
<a name=decimalFraction> 分母值是 for() 環路執行次數
小數至分數 ; 例題 , , , , ,
=

執行 11 ☞

上面是單值輸入、單值輸出。下面是多值輸入、多值輸出。
方格16 輸入 ; 方格16 輸入,方格17 輸出

, , 執行 22 ☞ ☜ 只輸入分數; [ 減等 ]
方格17 輸出 ; 執行 23 ► ◄ 分數及文字
控制 環路執行上限 最大迭次 max0 內定 1000000
面板 停止關鍵字串 精確度 zero6 內定 .000000
無理數需用控制面板,大多數有理數無需控制面板
QBboxc17.value='' ; stochMat[ ] ; QBspanDrawMat.innerHTML='' ; QBspanAlert1.innerHTML=''
function decimal2fraction(arg1,arg2,arg3) ; function text0to9fraction(in0,arg2)
function doublStochMat( )





實數計算器 ;
分數至小數計算器 無素數功能,無複數功能,
整數甲除整數乙可行。簡化函數名稱 d2f(1/3+1/4+1/5+1/6+1/7) 可行
方格81 點擊 [例1] 或 [例2] ,再點擊[實數計算器]

方格81 input 方格82 輸出 , , ,
方格82 ; , ,

上下限值= ; ,
方格83 ;

QPboxc83.value='' ;
[=][=]





<a name=UnicodeSymbol>

統一碼數學符號: ℂ ℍ ℕ ℙ ℚ ℝ ℤ ℽ ℾ ℿ ⅀ ⅅ ⅆ ⅇ ⅈ ⅉ ; × ÷ ° ◦ º ¹ ² ³
≦ ≠ ≧ < = > ± ≡ ≈ ≌ ≒ ∏ ∑ √ ∛ ∜ ∝ → ∞ ∈ ∀ ∂ ⊥ ∃ ∋ ∆ ∇ ⊿ ∟ ∠ ∫ ∬ ∭ ∮ ∥
≺ ≻ ≼ ≽ ≾ ≿ ⊀ ⊁ ≭ ≮ ≯ ≰ ≱ ≲ ≳ ≴ ≵ ≶ ≷ ≸ ≹ ∧ ∨ ∩ ∪ ∴ ∵ ∶ ∷ ⊂ ⊃ ⊄ ⊅ ⊆ ⊇
Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π Ρ ΢ Σ Τ Υ Φ Χ Ψ Ω , + - * /
α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ ς σ τ υ φ χ ψ ω
106,06,20,20,44 劉鑫漢取閱 en.wikipedia.org 網頁,找到下面統一碼數學符號。
https://en.wikipedia.org/wiki/List_of_mathematical_symbols
en.wikipedia.org-wiki-List_of_mathematical_symbols.htm
∧,⇒,−,∖,√,≥,≤,∓,⋅,⁄,⇔,∈,ℤ,ℝ,φ,π,∑,∫, ,∮,∯,∰,…,⋯,⋮,⋰,⋱,∴,∵,≠
˜ ,∝,∞,■,□,∎,▮,‣,≈,≃,≅,♎,≒,△,≡,≜,≝,≐,↔,≪,≫,≦,≧,≺,≻,◅,▻,→,⊃,⊆
⊂,∩,ℕ,ℚ,⊇,∪,↦,•,⊧,∨,⊢,⟨,⟩,ψ,α,β,–,‖,⌊,⌉,⌋,⌈,ℂ,∗,∣,∤,∥,∦,⋕,⊥
∃,≀,↯,※,⇐,⊕,⊻,∐,′,∀,∂,∉,∌,∋,ℍ,ω,○,∘,∅,ℙ,†,⊤,—,⊗,⋉,⋊,⋈,​,ℵ,ℶ
δ,∆,⊖,Δ,ƒ,∇,∏,σ,


<a name=pictureChar>

象形文字,册=書的側面圖像(公用電話下面掛的電話簿) ; 目=眼睛 ; 口=嘴形 ;
山= ; 川=河流 (河岸, 流線, 河岸 ) ; 田=有走道的農地 ; 門=住宅前的兩塊活動木板
事=結繩記錄活動 (最頂一橫是橫架,垂直線是繩索,繩上有兩個結代表記錄活動 )
日=太陽 ; 月=地球衛星 ; 木=樹 ; 東=日出的方向 (清晨日出時被樹擋住的景象 )
立=站姿 ; 見=張望 ; 親=父母 (一個兒子站在樹上 [爬高] 向遠處張望,期待父母早歸)
出=離開家門 (遠行,走過一山又一山) a606190148 車=運貨工具 (兩輪手推工具,上下
兩橫代表兩輪,縱立線代表輪軸,田字代表載貨板,鳥瞰如車) ; 艸=草 a606211119
小=尺寸少 (一個人兩腿碰膝站立,雙手近腿,佔據空間尺寸少) a606211132
大=尺寸大 (一個人兩腿廣開站立,雙手平伸外張,佔據空間尺寸多)
太=過份了 ; 人=高等動物 ; 巢=鳥的家 (樹[木]頂上一個窩[田],三隻小鳥 ≺≺≺ 在窩內 )
弓=發箭器,弓字形狀像發箭器; 引=導向,一個弓及一個箭代表箭行方向就是導引方向。
凸=比平面高出部份 ; 凹=比平面低下部份 ; 串=兩個物件以繩相連;



<a name=LiuHH>

劉鑫漢在中華民國三十七年二月十七日出生於漢口市。
劉鑫漢三歲時照片 father09.jpg
劉鑫漢七歲時照片 father01.jpg
劉鑫漢二十二歲至三十五歲時照片 liuhh001.jpg
劉鑫漢三十五歲時照片 liuhh004.jpg
劉鑫漢六十四歲時照片 liuhh007.jpg
現在,中華民國一○六年,劉鑫漢已經七十歲,一無所成,一無所有,
如果讀者喜歡小數至分數計算器網頁,那麼,劉鑫漢就有一絲成就感☺
106,06,22,20,15


<a name=document>

106,06,23,15,10 
本卷 http://freeman2.com/dec2frac.htm 
是「小數至分數計算器」。下面介紹程式如何工作?
首先談論一個例題。考慮
17/57 = 0.2982456140350877 
假設我們已知小數 0.2982456140350877 待求分數。
許多分數都是無限長,分數必須在某處切斷。假設
E0=0.2982456140350877 及
E1=0.29824561403508 及
E2=0.29824561403509
上面的微小誤差,有不同的結果。
0.29824561403508*57=16.99999999999956
0.29824561403509*57=17.000000000000128
字串 '.999999' 與字串  '.000000' 有不同的處理方法。

<a name=docF002>
程式使用兩個控制參數,
最大迭次 max0 ,環路執行上限,內定值 max0=1000000 
精確度 zero6, 內定值 zero6='.000000'
精確度 '.000000' 與精確度 '.0' 得到非常不同的結果
,長串零 '.0000000000000' 得到更為精確的答案。
我們知道 17/57 = 0.2982456140350877 因此,如果
對 0.2982456140350877 乘二、乘三、⋯⋯、乘 56、
乘 57,總有一次得到乘積接近整數 16.99999999999956 
或者 17.000000000000128 
<a name=docF003>
接近整數的乘積如 17.00000000000001
接近整數的乘積如 16.99999999999999
如果設定 zero6='.000000' 在 17.00000000000001 
找到 '.000000' 此時,程式停止迭代環路,因為找到答案了。

平行於 zero6='.000000' 程式使用另外一個變數
nine6='.999999'. 如果在乘積 16.99999999999999 
找到 '.999999' 程式停止迭代環路,建立答案字串。

<a name=docF004>
106,06,23,15,49
上面是程式精要,下面是程式結構。

//change decimal 0.6888888888888889 to fraction 31/45
//arg1 is a decimal number, 
//arg2 is a maximum bound, default 1000000
//fraction numerator = arg1*i0. If arg1*i0 has 
//'.000000' or has '.999999' then find fraction.
//fraction denominator bound by maximum arg2
//If arg1*i0 has '.000000' //addone=0
//fraction=parseInt(arg1*i0)/i0
//If arg1*i0 has '.999999' //addone=1
//fraction=parseInt(arg1*i0+1)/i0
//see code line   //aa=parseFloat(arg1);
//n0=parseInt(i0*aa+addone); //a606181808 +addone
//see code line  
//return n0+'/'+i0; //a606180952
//
//addone=1 is correct, if input decimal>0 //a606191148
//

<a name=docF005>
函數 decimal2fraction(arg1,arg2,arg3) 有三個輸入參數
arg1 及 arg2 及 arg3
arg1 是小數的字串形式或者實數形式。
字串 '12' 加 字串 '34' 得到 字串 '1234'
實數  12  加 字串 '34' 得到 字串 '1234'
實數  12  加 實數  34  得到 實數  46
爪哇簡稿 Javascript 是一個字串主導的電腦語言。
arg2 是最大迭代次數,內定值 1000000 。
arg3 是精確度,內定值 6 代表 '.000000'  6 個零。

<a name=docF006>

function decimal2fraction(arg1,arg2,arg3) //a606180930
{
var i0,j0,k0,L0,m0,n0,n1,n2,n3,n4;
if(typeof(arg1)!='string'
 &&typeof(arg1)!='number')
return 'decimal2fraction(arg1,arg2,arg3) arg1 必須是實數。\n'
+'現在 typeof(arg1)='+typeof(arg1)+'\n'

var aa=parseFloat(arg1);
if(isNaN(aa))return 'NaN/1'; //a607260547
<a name=docF007>
函數 decimal2fraction(arg1,arg2,arg3) 設計為一個小數輸入
(=arg1) 及一個分數輸出。輸入的小數
可以是字串小數,例如, '0.2982456140350877',
也可以是實數小數,例如,0.2982456140350877 。
相對於一個小數輸入及一個分數輸出,那就是多個小數輸入及多個
分數輸出。多個數值必須以數列形式傳送,例如,
[0.12,0.34,0.56],或者 ['87/28', '29/21', '4/35']
函數 decimal2fraction(arg1,arg2,arg3) 發覺輸入值是數列
,此時函數 decimal2fraction() 拒絕執行。
不論輸入是字串小數或者實數小數,程式都呼叫
var aa=parseFloat(arg1); 
if(isNaN(aa))return 'NaN/1'; //a607260547
把字串小數 '0.2982456140350877' 
改為實數小數 0.2982456140350877 
輸入的小數在 for() 環路乘許多整數,只有實數小數能夠執行
運算。所有輸入值都來自網頁輸入方格。
<a name=docF008>
網頁輸入方格的值都是字串,如果使用者在方格填入 '0.27'
aa=parseFloat(arg1); 改字串小數 '0.27' 為實數小數
 0.27 。如果使用者在方格填入 'aaa' 按鈕內的指令
//紅色斜體字是按鈕內的指令
//藍色斜體字是函數內的指令
if(isNaN(L0)
 ||L0.length==0
  )
QBAnsMsg1.innerHTML='Input decimal=['+QBDecimal.value+']'; 
上面指令展示錯誤 'aaa' 並且停止小數至分數轉換。
106,06,23,16,31

<a name=docF009>
//var max0=1000000; //a606180936
//var max0=1000000000; //a606181031
//var max0=10000000; //a606181042
var max0=1000000; //a606181051
if(arguments.length>1)
  {
m0=parseInt(arg2);
if(!isNaN(m0)&&m0>=1000)max0=m0;
  }
<a name=docF010>
把小數 0.2982456140350877 改為分數 17/57 需要用 for() 
環路對小數 0.2982456140350877 乘遞增整數,未來是未知,
不能讓環路跑到無限大,必須設定上限。輸入參數 arg2 決定上限,
函數 decimal2fraction(arg1,arg2,arg3) 內定環路上限為
 max0=1000000; 指令行 m0=parseInt(arg2); 把 arg2
改為整數 m0 。如果 m0>=1000 則 max0=m0; 
「m0 是實數」與「m0 不是非實數 !isNaN(m0) 」意義相同。
驚嘆符號 '!' 代表否定
 isNaN('aaa') 答案為真,「'aaa' 不是數字」是正確的。
!isNaN('aaa') 答案為假,「'aaa' 是數字」是錯誤的。
 isNaN('0.2') 答案為假,
!isNaN('0.2') 答案為真。
指令行 m0>=1000 要求使用者指定的環路上限至少為一千,
如果吻合,把 max0 改為使用者指定的環路上限。

<a name=docF011>
var zero6='.000000';
var nine6='.999999'; //a606192125
//a606260627 use arg3 control zero6, nine6

if(arguments.length>2) //a606260629
  {
m0=parseInt(arg3);
if(!isNaN(m0)&&m0!=6&&m0>=1&&m0<=15)
    {
n3=n4='.';
for(j0=0;j0<m0;j0++)
{ n3+='0'; n4+='9'; }
zero6=n3;
nine6=n4;
    }
  } //if(arguments.length>2) //a606260636

106,06,26,12,38
指令 if(arguments.length>2) 說如果有第三個輸入參數,
把第三個輸入參數改為整數 m0 如果 m0 確實為整數,不等於六
及 m0 大於等於一及 m0 小於等於十五,那麼就進入加工指令區。
首先令 n3=n4='.'; 再啟動一個 for() 環路,執行 m0 次,
每次對 n3 貼入一個 '0' ,對 n4 貼入一個 '9' 。
完成 for() 環路之後,(假設 m0=8 )
zero6 由內定值 '.000000' 改為新值 '.00000000' 
nine6 由內定值 '.999999' 改為新值 '.99999999' 
106,06,26,12,49

黃底區指令自函數指令 function decimal2fraction(arg1,arg2,arg3) 移至按鈕指令。目的為使函數 decimal2fraction() 執行的更快。 a606260955 //QBControlA.value='1000000 ' //QBControlB.value='.000000 ' if(typeof(QBControlA)=='object' &&typeof(QBControlB)=='object' &&typeof(QBspanControlA)=='object' &&typeof(QBspanControlB)=='object' )

<a name=docF012> 此處檢查網頁是否有讓使用者控制的輸入方格 QBControlA 環路執行上限輸入方格 QBspanControlA 環路執行上限表達物件 QBControlB 停止關鍵字串輸入方格 QBspanControlB 停止關鍵字串表達物件 上面四行是四個網頁物件的證號,如同人的身分證號, 是唯一的證號,絕無重複,應用如下。
控制 環路執行上限 最大迭次 max0=1000000
面板 停止關鍵字串 精確度 zero6=.000000

黃底區指令自函數指令 function decimal2fraction(arg1,arg2,arg3) 移至按鈕指令。目的為使函數 decimal2fraction() 執行的更快。 a606260955 證號 QBControlA 是上面填有 '1000000' 的輸入方格 證號 QBspanControlA 在上面展示 'max0=1000000 ' 證號 QBControlB 是上面填有 '.000000' 的輸入方格 證號 QBspanControlB 在上面展示 'zero6=.000000 ' 如果網頁有上面四個證號的物件,那麼就進入下面指令區工作。 <a name=docF013> 網頁 dec2frac.htm 指令檢查有沒有自己網頁的物件? 這不是畫蛇添足、多此一舉嗎? 不錯,在 dec2frac.htm 網頁內確實是多此一舉!但是! 如果有人自 dec2frac.htm 複製函數 decimal2fraction(arg1,arg2,arg3) 至其他網頁 同時忘記複製四個網頁物件,上面四個驗證物件指令失敗,於是 在他人網頁,程式流程不進入下面處理物件的指令,沒有錯誤, 使用內定值 zero6='.000000',使用內定值 max0=1000000 程式照樣可以正常工作。 如果讀者要使用本卷的函數 decimal2fraction(arg1,arg2,arg3) 至您的網頁,請放心複製,最好能夠連 四個網頁物件一並複製。 106,06,23,17,30 <a name=docF014> { //external control begin n0=parseInt(QBControlA.value); if(n0>=1000&&n0<=1.e12) { max0=n0;} 上面指令控制環路執行上限,如果使用者指定上限大於等於一千 及指定上限小於等於一萬億 1.e12 就取用使用者指定的上限。 上面是網頁物件 QBControlA 控制 for() 環路執行上限 下面是網頁物件 QBControlB 控制 答案精確度。 <a name=docF015> n1=QBControlB.value n2=n1.indexOf('.'); if(n2>=0) { for(i0=n2+1;i0<n1.length;i0++) if(n1.charAt(i0)!='0')break; //if((i0-n2)>=4&&(i0-n2)<=12) //a606231001 allow PI=22/7 if((i0-n2)>=2&&(i0-n2)<=15) { n3=n4='.'; for(j0=1;j0<(i0-n2);j0++) { n3+='0'; n4+='9'; } zero6=n3; nine6=n4; } //if((i0-n2)>=4&&(i0-n2)<=12) } //if(n2>=0) <a name=docF016> n1=QBControlB.value=字串 '.00000' 假設略為複雜的 '7.0006' (小數點左側有 7 ) 指令 n2=n1.indexOf('.'); 在 n1='7.0006' 中找到 小數點 '.' 的位置(位置 0 是 7 ,位置 1 是小數點 ) 如果使用者輸入 '000000' 沒有小數點,那麼指令 n2=n1.indexOf('.'); 得到 n2=-1 負一代表在 n1='000000' 沒有小數點。 如果使用者輸入 '.00000' 得到 n2=0 如果使用者輸入 '7.0006' 得到 n2=1 爪哇簡稿語言序列指標由零開始,不由一開始。 n2=1 或 n2=0 都符合 if(n2>=0) 於是指令流程進入 if() 主體。 <a name=docF017> for() 環路 for(i0=n2+1;i0<n1.length;i0++) if(n1.charAt(i0)!='0')break; 指標 i0 由 n2+1 開始,n2指向小數點,n2+1 是小數點 右側第一個 '0' 。 在輸入字串 '7.0006' 中, 藍色 0 不吻合 if(n1.charAt(i0)!='0') 不停止 for() 環路 紅色 0 不吻合 if(n1.charAt(i0)!='0') 不停止 for() 環路 黑色 0 不吻合 if(n1.charAt(i0)!='0') 不停止 for() 環路 '6' 吻合 if(n1.charAt(i0)!='0') '6' 不= '0' 為真, 要停止 for() 環路。離開 for() 環路之後, i0=5 指向 '6' 同時 n2=1 指向 '.' 看下面字串與指標示意圖 字串 '7.0006' 指標 012345 106,06,23,18,11 <a name=docF018> 106,06,23,18,43 下面是條件指令 if() //if((i0-n2)>=4&&(i0-n2)<=12) //a606231001 allow PI=22/7 if((i0-n2)>=2&&(i0-n2)<=15) 另外一個網頁 http://freeman2.com/dbstochm.htm 使用 //if((i0-n2)>=4&&(i0-n2)<=12) 本卷 http://freeman2.com/dec2frac.htm 使用 if((i0-n2)>=2&&(i0-n2)<=15) 假設輸入 '7.0006' i0=5 指向第一個非 '0' 的 '6' n2=1 指向 '7.0006' 中的點 '.' 那麼 i0-n2=5-1=4 這個 4 表示在 '7.0006' 中 '.000' 有 四位元。如果ˊ這種「點+零」字串長度大於等於二及長度 小於等於十五,就執行 for() 環路。 <a name=docF019> n3=n4='.'; for(j0=1;j0<(i0-n2);j0++) { n3+='0'; n4+='9'; } 因為 (i0-n2) 是「點+零」字串長度,指令 n3=n4='.'; 已經存入一點 '.' 下面串零的環路指令 for(j0=1; j0=1 由一開始(j0 不由零開始)代表已經考慮 '.' (跳過 '.') 如果使用 for(j0=0; 不跳過 '.' 輸出不是使用者意願。 假設輸入 '7.0006',其中 '.000' 佔有四位元,for(j0=1; j0=1 代表跳過 '.',那麼,建立 n3 及 n4 就是 n3+='0'; n4+='9'; 執行 (i0-n2)-1 次,也就是執行 4-1=3 次。結果為 n3='.000'; 及 n4='.999'; <a name=docF020> zero6=n3; nine6=n4; zero6 及 nine6 是後面小數至分數計算指令使用的變數。 n3 及 n4 是使用者意願。指令 if((i0-n2)>=2&&(i0-n2)<=15) 是過濾指令,要求 2<= 「點+零」字串長度 <=15 如果略除小數點 1<= 「零 0」字串長度 <=14 如果使用者在「停止關鍵字串」方格填入 '.0' 及輸入小數 為圓周率=3.141592653589793 ,程式輸出 22/7 。 dec2frak.htm 容許 '.0' ,但是 dbstochm.htm 不容許。 <a name=docF021> QBspanControlA.innerHTML='max0='+max0; QBspanControlB.innerHTML='zero6='+zero6; //a606192211 //external control end } //if(typeof(QBControlA)=='object' // &&typeof(QBControlB)=='object') 上面指令把程式使用的環路執行上限 max0 及停止關鍵字串 zero6 送至頁面 方格17 下面黃底區指令自函數指令 function decimal2fraction(arg1,arg2,arg3) 移至按鈕指令。目的為使函數 decimal2fraction() 執行的更快。 a606260955

上面收集使用者數據, 下面小數至分數計算過程 <a name=docF022> var bb,ans0; var addone=0; //a606181806 在函數 decimal2fraction(arg1,arg2,arg3) 起始定義了 var aa=parseFloat(arg1); if(isNaN(aa))return 'NaN/1'; //a607260547 aa 是使用者指定的小數(實數),實數可以參與計算。 變數 bb=i0*aa , i0 是 for(i0=2;i0<max0;i0++) 環路的迭代次數。 bb 由實數轉換為字串。 變數 addone 調整分數分子的值。為什麼需要 addone ? 請看下面例題。 <a name=docF023> 假設使用者指定的小數為 0.0754716981132076=4/53 for(i0=2;i0<max0;i0++) 環路對指定小數 0.0754716981132076 乘 2,3,4,5 ... 一直到 53 2 * 0.0754716981132076=0.1509433962264152 3 * 0.0754716981132076=0.2264150943396228 ..... 50 * 0.0754716981132076=3.77358490566038 51 * 0.0754716981132076=3.8490566037735876 52 * 0.0754716981132076=3.924528301886795 53 * 0.0754716981132076=4.000000000000003 乘積 4.000000000000003 有 '.000000' 據此, 我們可以說「找到答案了」指定小數的等值分數是 4/53 分數分母是 i0=53 ,分數分子是 i0*aa=4.000000000000003 分數答案必須是整數甲除整數乙,4.000000000000003 很接近於整數。指令 n0=parseInt(i0*aa+addone); 把 4.000000000000003 改為 4,答案是 4/53,此時, 變數 addone=0 <a name=docF024> 假設使用者指定的小數為 0.766385302879841=3087/4028 for(i0=2;i0<max0;i0++) 環路迭次乘整數如下 4026 * 0.766385302879841=3085.46722939424 4027 * 0.766385302879841=3086.2336146971197 4028 * 0.766385302879841=3086.9999999999995 乘積 3086.9999999999995 有 '.999999' ,據此, 我們可以說「找到答案了」指定小數的等值分數是 3087/4028 分數分母是 i0=4028 分數分子是 i0*aa=3086.9999999999995 分數答案必須是整數甲除整數乙,3086.9999999999995 很接近於整數。指令 n0=parseInt(i0*aa+addone); 把 3086.9999999999995 改為 3087 ,答案是 3087/4028 此時,變數 addone=1 此處, 如果變數 addone=1 則 parseInt(3086.9999999999995+1) 得到分子是 3087 ,正確。 如果變數 addone=0 則 parseInt(3086.9999999999995+0) 得到分子是 3086 ,錯誤。 <a name=docF025> 如果使用者指定的小數為正或負,同時 i0*aa 乘積含有 '.000000' 指定 addone=0 得到正確答案。 如果使用者指定的小數為正值 同時 i0*aa 乘積含有 '.999999' 指定 addone=1 得到正確答案。 如果使用者指定的小數為負值 同時 i0*aa 乘積含有 has '.999999' 指定 addone=-1 得到正確答案。 106,06,23,20,08 <a name=docF026> 106,06,23,20,55 for(i0=2;i0<max0;i0++) { k0=i0*aa; bb=k0+''; //if(bb.indexOf('.000000')>0)break; //a606192126 if(bb.indexOf(zero6)>0)break; //a606191151 if(aa<0)addone=-1; a tricky error //if(bb.indexOf('.999999')>0) //a606192127 if(bb.indexOf(nine6)>0) { if(aa>=0)addone=1;else addone=-1; break; } if(k0==parseInt(k0))break; //a606180950 } //for(i0=2;i0<max0;i0++) <a name=docF027> 在 for(i0=2;i0<max0;i0++) 環路中 i0 將會是 分數分母的值,i0 必須由 i0=2 開始,因為, 17/1 或 17/0 都不能是答案。指令 i0<max0 也就是 i0<1000000 強迫終止 for() 環路,例如輸入分數是無理數圓周率 3.141592653589793..... ,只有強迫終止才可能停工。 k0=i0*aa; 是實數 3086.9999999999995 bb=k0+''; 是字串 '3086.9999999999995' 在實數內,無法找是否實數 3086.9999999999995 含有 字串 '.999999' 在字串內,可以找是否字串 '3086.9999999999995' 含有字串 '.999999' <a name=docF028> 在 for(i0=2;i0<max0;i0++) 環路中有三種提前終止 環路的條件。 if(bb.indexOf(zero6)>0)break; 變數 zero6='.000000' bb=k0+''; 是字串 '4.000000000000003' 在字串 '4.000000000000003' 找是否含有字串 '.000000' 如果找到 '.000000' 終止環路 for(i0=2;i0<max0;i0++) 不需要設定 addone=0 ,因為 addone 初始值就是零。 <a name=docF029> if(bb.indexOf(nine6)>0) { if(aa>=0)addone=1;else addone=-1; break; } 變數 nine6='.999999' bb=k0+''; 是字串 '3086.9999999999995' 在字串 '3086.9999999999995' 找是否含有字串 '.999999' 如果找到 '.999999' 終止環路 for(i0=2;i0<max0;i0++) 必須設定 addone=1 or -1. 因為 addone 初始值是零。 parseInt( 3086.9999999999995+1) 得到 3087 parseInt(-3086.9999999999995-1) 得到 -3087 <a name=docF030> 4.000000000000003 不=4=parseInt(4.000000000000003) 但是,有些計算直接得到整數答案,例如, i0*aa=5*0.2=1 字串 '1' 沒有 '.000000', 沒有 '.999999' 但是有 1=1=parseInt(1) 這種情況 if(k0==parseInt(k0))break; //a606180950 終止環路。 <a name=docF031> //下面是快速答案,無 if(),無 indexOf() n0=parseInt(i0*aa+addone); //a606181808 +addone n1=bb.indexOf('.'); //a607121258 if(n1>=0) n2=bb.substring(0,n1); else n2=bb; //a607121319 if() else n0=parseInt(n2)+addone; //a607121259 return n0+'/'+i0; //a606180952 } //function decimal2fraction(arg1,arg2,arg3) 函數 decimal2fraction(arg1,arg2,arg3) 至此結束。 指令行 n0=parseInt(i0*aa+addone); 把 4.000000000000003 改為 4 把 3087.9999999999995 改為 3087 把 -3087.999999999999 改為 -3087 n0 是分子, i0 是分母,除號 '/' 是字串, 實數 n0 + 字串 '/' + 實數 i0 得到字串 '4/53' 。 指令行 return n0+'/'+i0; 把答案送回原呼程式。 106,06,23,21,30 <a name=docF031b> 106,07,12,13,29 內植函數 parseInt() 有下面兩種答案 parseInt(1.9999999999999997)=1 parseInt(1.99999999999999997)=2 n0=parseInt(i0*aa+addone) 可以 //addone=1 n0=parseInt(i0*aa+addone) 錯誤 ! 藍色指令使用變數 addone 得到正確答案, 紅色指令使用變數 addone 得到錯誤答案。 106,07,12,12,55 使用下面指令 n1=bb.indexOf('.'); //a607121258 if(n1>=0) n2=bb.substring(0,n1); else n2=bb; //a607121319 if() else n0=parseInt(n2)+addone; //a607121259 避免錯誤。 假設使用者輸入 0.0754716981132076 在 0.0754716981132076*53 之後,得到 4.000000000000003 a607121258 指令在 '4.000000000000003' 之中找 '.' 的位置, a607121319 if() else 指令 自 '4.000000000000003' 提取 '4' a607121259 指令把字串 '4' 改為數字 4 。 return n0+'/'+i0; 把分數 '4/53' 送至原呼程式。 106,07,12,13,42 <a name=docF032> 劉鑫漢不是一個專業編程者,上面的編程工作未能達到最 佳境地,如果讀者懂編程,讀者可以改進編程結構,增加 效率。讀者可以在任何場合應用上面編程,不必問劉鑫漢 可否,因為劉鑫漢的答覆都是「可以,你可以在任何場合 應用劉鑫漢的編程。」 106,06,23,21,36 <a name=docF033> 106,06,24,08,48 如果讀者問「有沒有應用函數 decimal2fraction() 的例題?」請取閱均化矩陣網頁 http://freeman2.com/dbstochm.htm 英文是 doubly stochastic matrix : 雙隨機(矩)陣 又稱「優控化矩陣」在 dbstochm.htm 有點選方格 0.688... decimal 如果讀者不打勾 0.688... decimal 程式輸出如下
4
3
3
3
2
=
0.5625 0.0625 0 0.125 0.25
0 0.6666666666666666 0 0.3333333333333333 0
0 0 1 0 0
0.25 0.25 0 0.5 0
0.1875 0.020833333333333332 0 0.041666666666666664 0.75
*
6
4
3
1
1
Doubly stochastic matrix table is created by http://freeman2.com/dbstochm.htm
doublStochMat() Date/Time: 106,06,24,08,58,08.605, 耗時秒數=0.005 秒
如果讀者要打勾 31 / 45 fraction 程式輸出如下
4
3
3
3
2
=
9/16 1/16 0/2 1/8 1/4
0/2 2/3 0/2 1/3 0/2
0/2 0/2 2/2 0/2 0/2
1/4 1/4 0/2 1/2 0/2
3/16 1/48 0/2 1/24 3/4
*
6
4
3
1
1
Doubly stochastic matrix table is created by http://freeman2.com/dbstochm.htm
doublStochMat() Date/Time: 106,06,24,09,00,42.386, 耗時秒數=0.024 秒
<a name=docF034> 用文字編輯器打開 http://freeman2.com/dbstochm.htm 源碼卷,找下面指令 //doubly stochastic matrix function doublStochMat( //a606120748 aStr //define alpha sequence, more average , bStr //define beta sequence, more diverse ) { //9906172025 start stochastic0() //a606120748 start doublStochMat() ..... //<a name=docF035> if(typeof(QBfraction)=='object' &&QBfraction.checked &&typeof(decimal2fraction)=='function' ) { for(i0=0;i0<stochMat.length;i0++) for(j0=0;j0<stochMat.length;j0++) stochMat[i0][j0]=decimal2fraction(stochMat[i0][j0]); //a606181625 fraction output OK } //if(typeof(QBfraction)='object'&&QBfraction.checked) return stochMat; //9906191748; a606121622; a606181626 } //function doublStochMat() //a606162016 上面粗體、斜體、藍色文字就是使用函數 decimal2fraction() 改小數至分數的指令。讀者請參考這一段指令,寫讀者自己 的編程指令。 106,06,24,09,23 <a name=docF036> 106,06,27,09,02 在方格16 下面有一行如下 執行 22 ☞ ☜ 只輸入分數; [ 減等 ] 什麼是「減等」?「減等」就是減號或者等號。 減等方格容許使用者填入減號或者等號,如果刪除方格內容, 內定值是 ' - ' 。填入符號之後,點擊 [decimal2fraction()] 按鈕內的指令讀取減等方格的值。 方格17 答案使用減等方格值。 假設減等方格值為減號 '-' 方格17 答案如下 3087/4028 - 0.766385302879841 <a name=docF037> 使用者複製答案,貼入方格81,再點擊按鈕, 方格82輸出如下 [[ 3087/4028 - 0.766385302879841 1.1102230246251565e-16 ]] 確定 3087/4028 及 0.766385302879841 有相同的值, 誤差為 1.1102230246251565e-16 。 另一方面,如果使用者在減等方格填入等號,方格17 答案如下 3087/4028 = 0.766385302879841 這是正常輸出。 106,06,27,09,16 <a name=docF038> 106,06,27,10,05 十分鐘以前修改了 內部 指令,關鍵字串為 'a6062709' 及 'minusE2' 如果方格16 輸入負值 -0.05109235352532273 方格17 輸出 -1029/20140 - -0.05109235352532273 不能接受上面一行。 如果減等方格的字串含有 '-(' 新加指令把 minusE2='' 改為 minusE2=')' ,輸出如下 -1029/20140 - ( -0.05109235352532273 ) 這是可以計值的表示法。 106,06,27,10,12 <a name=docF039> 106,07,11,16,05 更新 106,07,12 增加 按鈕表示在 dec2frak.htm 可以輸入下面指令 [[ cc=decimal2fraction(1/3+1/4+1/5+1/6+1/7) cc // 印出 cc 值 153/140 -(1/3+1/4+1/5+1/6+1/7) //確認 ]] 程式接受分數和的輸入及分數的輸出。其他計算器網頁 例如 prime_e3.htm , complex4.htm 都沒有 function decimal2fraction() 之定義,所以, 其他計算器網頁不能輸出分數。 106,07,11,16,13 <a name=docF040> 106,07,11,19,33 剛才定義了函數 function d2f() //a607111927 做為完整函數 decimal2fraction(arguments[0]); 之別名。在實數計算器可以輸入指令 cc=d2f(1/3+1/4+1/5+1/6+1/7) 此指令與 cc=decimal2fraction(1/3+1/4+1/5+1/6+1/7) 全等,呼叫時,簡單多了。 106,07,11,19,38 <a name=docF041> 106,07,16,11,52 更新 106,07,16 跟隨中文版 均化矩陣、優控化矩陣、雙隨機矩陣,計算器 http://freeman2.com/dbstoch1.htm 的上載而略有變動。請讀者注意一點 http://freeman2.com/dbstoch1.htm 均化矩陣計算器 http://freeman2.com/dbstochm.htm 英文版 http://freeman2.com/dec2frak.htm 小數至分數計算器 http://freeman2.com/dec2frac.htm 英文版 都更正所有已知錯誤。但是,下面偵錯版均化矩陣計算器 http://freeman2.com/dbstochn.htm 英文版 偵錯版 故意保留了幾個產生錯誤的按鈕及故意保留部分錯誤指令, 請注意差別。劉鑫漢 106,07,16,12,01 <a name=docF042> 106,07,27,18,10 更新 106,07,27 更正函數 bye09() 中的錯誤。 錯誤指令行與正確指令行 a607211645 如下 //if(nine0<0)nine0--; // 負整數減一 if(in09<0)nine0--; //a607211645 更正之後,程式把 -0.99999999999 改為 -1 (錯誤指令改為 +1) 106,07,27,18,13 <a name=docF043> 106,07,29,15,09 更新 106,07,29 改變象形文字區使用的山形圖案 山=∆∆ 為山形圖片。關於「基數六四圖片字串」 (display Base64 images in HTML) 請見劉鑫漢工作記錄 http://freeman2.com/numjsdoc.htm#base64learnnumjsdoc.htm#docA008 106,07,29,15,15 [=][][]


<a name=JavascriptIndex>
Javascript index
http://freeman2.com/jsindex2.htm   local
Save graph code to same folder as htm files.
http://freeman2.com/jsgraph2.js   local






小數至分數計算器原本在英文版均化矩陣 (優控化矩陣)
doubly stochastic matrix 雙隨機(矩)陣
http://freeman2.com/dbstochm.htm
dbstochm.htm first Upload 2017-06-13
(請取閱相關讀書筆記 tute0047.htm)


小數至分數計算器 英文版
http://freeman2.com/dec2frac.htm
First Upload 2017-06-24

小數至分數計算器 中文版
http://freeman2.com/dec2frak.htm
首次上載:中華民國一○六年六月二七日
謝謝來訪劉鑫漢網頁
劉鑫漢 106,06,27,10,39
訪問時間:

//today.getYear()-1911 在劉鑫漢離線電腦得到正值,在全世界其他電腦都產生錯誤
//today.getYear()-1911 在劉鑫漢上線電腦得到負值
//today.getFullYear()-1911 在離線上線電腦都得到正值
//106,06,24,16,48 記錄