• 全部
...

谁有Javascript的代码,具体要求为将任意小数转化为分数的形式

hqsee 2006-06-01 09:07:46
谁有Javascript的代码,具体要求为将任意小数转化为分数的形式。比如:0.75转为:3/4的字符形式。
function DecimalToFraction(dec,digit)
{

}
第一个参数为:小数。第二个参数为:精度。即小数点后的位数。小数全部四舍五入为要求的精度。然后转化为分数的字符形式。先谢谢了。分不够可以再加,比较急。
...全文
给本帖投票
406 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
MYLiao 2006-07-15
  • 打赏
  • 举报
回复
mark
jiangtao088 2006-06-02
  • 打赏
  • 举报
回复
mark
hqsee 2006-06-02
  • 打赏
  • 举报
回复
我们定义了下面的规则:按精度4舍5入,找最小分母的一个分数。
假设现在是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>
buffer2005 2006-06-02
  • 打赏
  • 举报
回复
alert(DecimalToFraction(1.751,2));//转换后结果为7/4
alert(DecimalToFraction(1.745,2));//转换后结果为7/4

buffer2005 2006-06-02
  • 打赏
  • 举报
回复
/**
带精度的四舍五入
*/
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;

}
是是非非 2006-06-02
  • 打赏
  • 举报
回复
思路是这样的

先把分子变成1,分母为任意小数
然后在保证分子始终是整数的前提下,从1开始向上搜索
同时分母乘以相同的数,直到分母变成整数,或者太大了导致溢出
是是非非 2006-06-02
  • 打赏
  • 举报
回复
因为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>
hqsee 2006-06-02
  • 打赏
  • 举报
回复
谢谢大家的回答,但还是没有解决问题。
我的结果要求分母并不是100的形式,而是分母,分子都需要是整数。得出一个分数最接近dec的值。
buffer2005 2006-06-02
  • 打赏
  • 举报
回复
<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>
Forbes 2006-06-01
  • 打赏
  • 举报
回复
try:

<SCRIPT LANGUAGE="JavaScript">
<!--
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>
Mars_ZHOU 2006-06-01
  • 打赏
  • 举报
回复
上面的代码有点问题,用下面的
<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>
Mars_ZHOU 2006-06-01
  • 打赏
  • 举报
回复
函数写得有点乱,但是没有什么问题
<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>

87,995

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧

手机看
关注公众号

关注公众号

客服 返回
顶部