C++将小数(double)转化为分数(Rational)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++将小数(double)转化为分数(Rational)相关的知识,希望对你有一定的参考价值。
在C++中如何实现将小数转化为分数?我的想法是将小数的每一个数字转化为字符,再计算字符串的长度,但不知道如何做
C++中double类型的“长度”(位数)是很长的,就算像1.0/2=0.5也会存成0.50000...具体是多长跟编译器有关。一般来说,先确定了小数位数才能转成分数。比如说约定出现连续的若干个0的时候就舍弃这些0以及之后的部分(有限小数),或者找到循环节再用数学方法(求极限)推出这个分数,至于那些没有上面两种特征的小数显然是无理数或者存的位数不够,无法化成分数 把一个数的小数部分转成字符很容易s=(int)x;x=x-s;i=0;while(i<n) //要保存n位 x=x*10; a[i]=((int)x)%10; i++;这样程序结束后a[i]就保存了x的n位小数,当然n不能定的太大,超过int32(有对x取整的操作) 参考技术A 相信编码你应该没问题就提供给你一个我的思路吧
3.134
转换成字符串
无非分两段
整数部分 分数部分
整数部分先用int强制转换获取
然后除10直到0为止获取每位数
至于小数部分
可以每次乘10 然后取整数部分记录
再判断小数部分是否为0 循环来找
原值减去整数部分就是小数部分
小数部分
小数和百分数相互转化
function toPercent(point,num){ if (point==0) { return 0; } var str=Number(point*100).toFixed(num); str+="%"; return str; } //point 接收的数据 //num 保留小数位
toFixed() 方法
可把 Number 四舍五入为指定小数位数的数字。
NumberObject.toFixed(num)
num:必需。规定小数的位数,是 0 ~ 20 之间的值,包括 0 和 20,有些实现可以支持更大的数值范围。如果省略了该参数,将用 0 代替。
传说中这个方法有什么银行家算法,并不是四舍五入,我们可以对这个方法重写
银行家舍入法:四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一。
Number.prototype.toFixed = function (s) { var times = Math.pow(10, s); var des = this * times + 0.5; des = parseInt(des, 10) / times; return des + ‘‘; };
定义全局方法对负数进行处理
// num表示需要四舍五入的小数 // s表示需要保留几位小数 function toFixed(num, s) { var times = Math.pow(10, s); if (num < 0) { num = Math.abs(num);//先把负数转为正数,然后四舍五入之后再转为负数 var des = parseInt((num * times + 0.5), 10) / times; return -des; } else { var des = parseInt((num * times + 0.5), 10) / times; return des; } } console.log(toFixed(0.335, 2));//0.34 console.log(toFixed(-0.335, 2));//-0.34 console.log(toFixed(-1.5, 0));//-2
百分数转小数
var percent = "4.2%"; function toPoint(percent){ var str=percent.replace("%",""); str= str/100; return str; } var result = toPoint(percent); //0.042
以上是关于C++将小数(double)转化为分数(Rational)的主要内容,如果未能解决你的问题,请参考以下文章