如何解决Javascript |浮点数+间隔循环 如果您可以将输入数字表示为number类型因此小数位数不多,则可以使用常规数字减法来实现如果输入数字的小数位数很多,因此以string类型接收不能使用number类型显示,则需要按如下所示使用字符串进行减法
我有一个浮点数(例如):0.004178174922295
如何在特定的时间段(例如1秒)内使减量函数从该数字进行计算到0? 谢谢。
期望值:
0.004178174922295
0.004178174922294
0.004178174922293
...
0
解决方法
正如 raina77ow 和其他人在评论中指出的operations with decimal numbers are problematic in JS,approximations are made and the results may be inexact。
一种解决方法是将无穷小数转换为大整数,使用它们,最后将其转换回去。
这是您要找的东西吗?请让我知道。
编辑
您可以要求倒计时在一定时间内完成,它确实可以使用合理的数字,但是在Javascript the minimum interval is of 10 milliseconds中,您不能将间隔短于此。使用您给定的示例编号0.004178174922295
,就像从4178174922295
倒数到零。那将需要以10毫秒的间隔接近1325年(如果我的数学是正确的,无论哪种方式,我都希望您可以通过更短的间隔)。
function infinitesimalCountDown(num,seconds) {
// I create a coeficient to convert the decimal to an int
// Will be a big number starting with "1" and followed by a bunch of zeroes
let coefString = '1';
for(let i=0; i<num.toString().length-2; i++) {
coefString += '0';
}
const coef = Number(coefString);
// This has the digits from the original original but it's an int
let counter = Math.round(num*coef);
// Now I can just treat it as an int and convert it back for the output
const icdInterval = setInterval(() => {
counter--;
console.log(counter/coef);
if(counter <= 0) clearInterval(icdInterval);
},Math.round(seconds*1000/counter));
}
console.log("It works with a short number");
infinitesimalCountDown(0.0041,10);
setTimeout(() => {
console.log("It doesn't work with a long number");
infinitesimalCountDown(0.004178174922295,3000);
},12 * 1000);
如果您认为这些步骤对于Javascript进行处理是必需的,则可以执行以下操作:
function infinitesimalCountDown(num,seconds) {
let coefString = '1'
for(let i=0; i<num.toString().length-2; i++) {
coefString += '0'
}
const coef = Number(coefString)
let counter = Math.round(num*coef)
let steps = seconds * 1000 / counter
steps = steps < 100 ? 100 : steps
let step = 1
if(steps == 100) {
step = counter / ((seconds * 1000) / steps)
}
console.log(step)
const icdInterval = setInterval(() => {
counter -= step;
if(counter <= 0) {
counter = 0
clearInterval(icdInterval)
}
console.log(counter/coef)
},steps)
}
infinitesimalCountDown(0.004178174922295,5)
,
如果您可以将输入数字表示为number
类型(因此小数位数不多),则可以使用常规数字减法来实现。
在这里,重要的是获得要减去的单位。您可以使用Math.pow
获取单位。
从这个floating point guide开始,需要四舍五入,这可以使用toFixed
函数来完成。
let input = 0.004178174922295;
const decimalCount = input.toString().length - 2;
const unit = Math.pow(10,-1 * decimalCount);
console.log(input);
const loopInterval = setInterval(() => {
input = Number((input - unit).toFixed(decimalCount));
console.log(input);
if (input == 0) {
clearInterval(loopInterval);
}
},1000);
如果输入数字的小数位数很多,因此以string
类型接收(不能使用number
类型显示),则需要按如下所示使用字符串进行减法。
h3>
const input = '0.0041781749222934534534534535';
const inputArr = input.split('.');
const intNum = inputArr[0]; // Present integer
let decimals = inputArr[1]; // Present decimals after '.'
const unit = 1;
function replaceAt(str,index,replace) {
return str.substring(0,index) + replace + str.substring(index + 1);
}
console.log(input);
const loopInterval = setInterval(() => {
let index = decimals.length - 1;
while (parseInt(decimals[index]) < unit) {
decimals = replaceAt(decimals,index --,'9');
}
decimals = replaceAt(decimals,`${parseInt(decimals[index]) - unit}`);
console.log(`${intNum}.${decimals}`);
},1000);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。