Javascript 在计算过程中运行Do…直到满足条件

Javascript 在计算过程中运行Do…直到满足条件,javascript,conditional-statements,do-while,Javascript,Conditional Statements,Do While,我正在使用Javascript编写一个简单的do…while语句,该语句用于查看给定输入num的十进制长度,如果十进制长度大于或等于1,则取num并将其添加到自身,直到十进制长度等于0。目前,它适用于长度为1的小数,但如果大于1,它就会停止 例如,当num为8.75时,预期输出应为35,而不是17.5 该系列应采取4个步骤达到35 8.75 17.5 26.25 35 这是我的密码: const num = 8.75; var decimalLength = num.toString()

我正在使用Javascript编写一个简单的do…while语句,该语句用于查看给定输入
num
的十进制长度,如果十进制长度大于或等于1,则取
num
并将其添加到自身,直到十进制长度等于0。目前,它适用于长度为1的小数,但如果大于1,它就会停止

例如,当
num
为8.75时,预期输出应为35,而不是17.5

该系列应采取4个步骤达到35

8.75

17.5

26.25

35
这是我的密码:

const num = 8.75;
var decimalLength = num.toString().split(".")[1].length;
let result = "";
let i = num;

do {
  i = i + num;
  result = result + num;
  newLength = decimalLength;
} while (newLength < 0);

console.log(i);
const num=8.75;
var decimalLength=num.toString().split(“.”[1]。长度;
让结果=”;
设i=num;
做{
i=i+num;
结果=结果+数量;
新长度=分贝长度;
}而(newLength<0);
控制台日志(i);

您可以使用一些奇特的数学来得到一个更明确的答案,这个答案不会反复出现:

const num=8.75;
var decimal=num%1//小数部分
var decimalPlaces=num.toString().split(“.”[1]?.length | | 0//小数点
//GCD函数
常数gcd=(x,y)=>(!y?x:gcd(y,x%y));
//GCD介于小数点和1之间,需要将其设为整数才能得到乘数,因此每个数乘以10^[小数点]
//同样,当除以10^[小数位]时,得到剩余的数值,看看乘以什么可以得到整数
var乘数=10**小数位数/gcd(10**小数位数,十进制*10**小数位数)
//使用基本属性的日志更改以2的幂获得值
var outputExponent=Math.log(乘数)/Math.log(2)
//乘法
var outputValue=num*乘数
console.log(outputExponent)//乘以2的幂得到整数

console.log(outputValue)//整数本身
此版本使用递归函数和容差来处理浮点舍入错误

const firstIntMultiple=(n,tol=1e-6,c=1)=>
Math.abs(n*c-Math.floor(n*c))log(firstIntMultiple(14.058823529411764))/239/17
两个相互竞争的答案。哪个更好?没有办法知道,直到你测试出来。所以,这就是这个新答案试图做的

这些“测试”(如果您愿意的话)将每个函数运行50次,在清除控制台之前对每个迭代进行计时,并记录“平均时间”

8十进制精度 吸热龙:
const num=3.14159265;
//功能启动
常量firstIntMultiple=()=>{
var decimal=num%1;
var decimalPlaces=num.toString().split(“.”[1]?.length | | 0;
常数gcd=(x,y)=>(!y?x:gcd(y,x%y));
var乘数=10**小数位数/gcd(10**小数位数,十进制*(10**小数位数));
返回num*乘法器;
}
//功能端
变量时间=[]
对于(变量i=0;i<50;i++){
var startTime=新日期()
console.log(firstIntMultiple().toString())
推送次数((新日期()-startTime)/1000)
}
控制台清除()

console.log((times.reduce((a,b)=>a+b,0)/times.length)+“平均秒数”)
以下是所有答案的组合。这样做的好处是,它对每种输入都有一个“回退”。如果有终止小数,吸热龙的第一种方法就足够了。如果它是一个重复的十进制数,那么一个新的方法来确定一个答案就足够了。如果不足,则使用连分数作为回退

请注意,我最后包含连分数的唯一原因是因为它有时会导致小小数的错误。我只是想“修复”这个方法,但我不明白它是如何工作的,所以我把它作为一个后备方案

//位于顶部,以便查看
console.log(findMultiple(54.46333))/16339/300
console.log(findMultiple(8.333))//25/3
log(findMultiple(14.05882352941176))//非理性
log(findMultiple(94.03820382038203))//非理性
log(findMultiple(623.0549383482724))//1009349/1620
log(findMultiple(Math.PI))//非理性
log(findMultiple(13.000000221))//1829587379722249/140737488355328
log(findMultiple(1.0000003333))/1125900282105063/112589990642624
//主控
函数findMultiple(num,interpretLiteral=false,epsilon=1e-6){
if(num.toString().length<17 | | num%1==0 | |解释器文本){
返回吸热方法(num)//终止十进制
}
var checkRepeatingNum=CheckRepeating(num)
if(checkRepeatingNum!=false){
返回Math.round(吸热法(num,checkRepeatingNum)*num)//重复十进制
}否则{
return scottsauettefirstmethod(num,epsilon)//连分数
}
}
//预定义函数
//GCD
函数gcd(x,y){返回!y?x:gcd(y,x%y)};
//检查数字是否重复,如果重复,返回重复周期
函数检查重复(num){
var totalSearchLength=(num%1).toString().split('.')[1].切片(0,-1).length
var numTemp1=(num%1).toString().split('.')[1].切片(0,-1).split('').reverse().join('')
对于(变量i=1;i