函数写得有点乱,但是没有什么问题
<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 = 1 ;i < 10 ;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.888,2)
//-->
</SCRIPT>
<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 = 1 ;i < 10 ;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.888,2)
//-->
</SCRIPT>
<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>
<!--
function test(a, b) {
var x,y,z;
y=z=b=Math.pow(10,b);
x=a=a*b;
while(x>0){z=x;x=y%z;y=z};
return(a/z+"/"+b/z);
}
alert(test(0.75,2));
//-->
</SCRIPT>
<!--
/**
格式化小数
*/
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>
我的结果要求分母并不是100的形式,而是分母,分子都需要是整数。得出一个分数最接近dec的值。
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>
带精度的四舍五入
*/
function NumberRound(value,num){
value = value * Math.pow(10,num);
value = Math.round(value);
value = value / Math.pow(10,num);
}
写错了,忘记返回值了。
改为:
/**
带精度的四舍五入
*/
function NumberRound(value,num){
value = value * Math.pow(10,num);
value = Math.round(value);
value = value / Math.pow(10,num);
return value;}
alert(DecimalToFraction(1.745,2));//转换后结果为7/4
假设现在是4位的精度,我们把0.3442转成分数,将会出现下面的可能性,新的规则会选95/276,不选21/61 因为 0.34426 按4位精度 4舍 5入后,会变成0.3443。
0.3442会有下面相近的分数
11/32 = 0.34375
21/61 =0.3442622295
95/276= 0.34420289
1721/5000 =0.3442谢谢大家,问题基本已经解决,是由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>