<SCRIPT LANGUAGE=javascript>
<!--
function DecimalToFraction(dec,digit){
dec = Math.round(dec * (Math.pow(10,digit))) / Math.pow(10,digit) ;
var tmpa,tmpb
tmpa = dec*100
tmpb =100
for (var i = 100 ;i >0 ;i--){
var tmp = (tmpa/i).toString();
var tmp2 = tmp.indexOf(".")
if ( tmp2 == -1){
var tmp3 = (tmpb/i).toString();
var tmp4 = tmp3.indexOf(".")
if ( tmp4 == -1 ){
tmpa = tmpa/i
tmpb = tmpb/i
}
}
}
alert(tmpa+"/"+tmpb)
}
DecimalToFraction(0.25,2)
//-->
</SCRIPT>
//----------------------------------------------------------------------
----------------------------------------------------------------------
----------------------------------------------------------------------
<SCRIPT LANGUAGE="JavaScript">
<!--
/**
格式化小數
*/
function FormatNumber(value,num){
var valuelen = String(value).length;
var pointpos = String(value).indexOf(".");
var decimalcount =0;
if(pointpos==-1){
decimalcount =0;
}else{
decimalcount = valuelen-pointpos-1;
}
if(decimalcount<=num){
return value;
}else if(decimalcount<=num+1){
value = NumberRound(value,num);
alert(value);
return value;
}else{
var templen = decimalcount - num -1;
var endpos = valuelen-templen;
var valuestr = String(value).substring(0,endpos);
value = parseFloat(valuestr);
value = NumberRound(value,num);
return value;
}
}
/**
帶精度的四捨五入
*/
function NumberRound(value,num){
value = value * Math.pow(10,num);
value = Math.round(value);
value = value / Math.pow(10,num);
}
/**
將小數轉為分數
*/
function DecimalToFraction(dec,digit){
dec = FormatNumber(dec,digit);
alert(dec);
var decx,decy,decz;
decy=decz=digit=Math.pow(10,digit);
decx=dec=dec*digit;
while(decx>0){
decz=decx;
decx=decy%decz;
decy=decz
}
return(dec/decz+"/"+digit/decz);
}
alert(DecimalToFraction(1.751,2));
alert(DecimalToFraction(1.745,2));
//-->
</SCRIPT>
因為JavaScript在計算浮點數上的缺陷,我用VBScript實現
<script language="VBScript">
Function DecimalToFraction(dec)
If dec=0 Then
DecimalToFraction="0"
Exit Function
End If
If Fix(dec)=Dec Then
DecimalToFraction="1" / CStr(dec)
Exit Function
End If
Dim fm : fm=1/dec
If Fix(fm)=fm Then
DecimalToFraction="1 / " & CStr(fm)
Exit Function
End If
Dim nfm : nfm=fm
Dim i : i=1
WHile True
fz=i
fm=nfm*i
If Fix(fm)=fm Then
DecimalToFraction=CStr(i) & " / " & CStr(fm)
Exit Function
End If
i=i+1
If i>32768 Then
DecimalToFraction="溢出"
Exit Function
End If
Wend
End Function
MsgBox DecimalToFraction(3.14)
</script>
先把分子變成1,分母為任意小數
然後在保證分子始終是整數的前提下,從1開始向上搜尋
同時分母乘以相同的數,直到分母變成整數,或者太大了導致溢出
謝謝大家,問題基本已經解決,是由C#代碼轉化過來的。函數用了不少,感覺JS確實函數不夠豐富,好多都需要自己編寫。
謝謝
代碼如下:
<script lang="javascript">
String.prototype.trim = function()
{
return this.replace(/(^\s*)|(\s*$)/g, "");
}
//按精度四捨五入
function FormatNumber(b,a)
{
return Math.round(b*Math.pow(10,a))/Math.pow(10,a);
}
function DecimalToFraction(dec,_digit)
{
var returnF=String(dec);
var NUMFRACS=30;
var numerator = new Array();
var denominator = new Array();
var IsMinus = false;
if(dec<0)
{
IsMinus=true;
}
dec=Math.abs(dec);
var pre = Math.floor(dec);
var _dec = FormatNumber(dec-pre,_digit);
var d=0, d2=0, d3, d4 = -1;
var maxNumerator, L2;
d = d2 = _dec;
maxNumerator = getMaxNumerator(d.toString(10));
numerator[0]=0; denominator[0]=1;
numerator[1]=1; denominator[1]=0;
for(var i=2; i<NUMFRACS; i++)
{
L2 = Math.round(d2);
numerator[i]=L2*numerator[i-1] + numerator[i-2];
denominator[i]=L2*denominator[i-1] + denominator[i-2];
d3 = (numerator[i])/(denominator[i]);
if(d3==d4)
{
break;
}
if(Math.abs(numerator[i]) > maxNumerator)
{
break;
}
if(d3==d)
{
break;
}
d4=d3;
d2 = 1/(d2-L2);
}
for(var i=0; i<NUMFRACS; i++)
{
var h=0;
if(denominator[i]!=0)
{
h = parseFloat(numerator[i])/parseFloat(denominator[i]);
}
if(denominator[i]!=0&&FormatNumber(h,_digit)==_dec)
{
returnF=Math.abs(numerator[i])+"/"+Math.abs(denominator[i]);
break;
}
}
returnF = (IsMinus?"-":"")+(pre==0?"":pre)+(" "+returnF);
return returnF.trim();
}
function getMaxNumerator(f)
{
var f2 = null;
var ixe = f.indexOf("E");
if(ixe==-1) ixe = f.indexOf("e");
if(ixe == -1) f2 = f;
else f2 = f.substr(0, ixe);
var digits = null;
var ix = f2.indexOf(".");
if(ix==-1)
{
digits = f2;
}
else if(ix==0)
{
digits = f2.substr(1, f2.length);
}
else if(ix<f2.length)
{
digits = f2.substr(0, ix)+f2.substr(ix+1);
}
var L;
try
{
L = parseInt(digits);
}
catch(e)
{
return 999999999;
}
var numDigits = L.length;
var L2 = f.length;
var numIntDigits =L2.length;
if(L2==0) numIntDigits = 0;
var numDigitsPastDecimal = numDigits - numIntDigits;
for(var i=numDigitsPastDecimal; i>0 && L%2==0; i--) L/=2;
for(var i=numDigitsPastDecimal; i>0 && L%5==0; i--) L/=5;
return L;
}
function GetFraction()
{
var dec = parseFloat(document.all["txtDec"].value);
var digit = parseInt(document.all["txt"].value);
document.all["txtFraction"].value = DecimalToFraction(dec,digit);
}
</script>