Я хочу сделать простой счетчик, который будет вычислять число каждую миллисекунду плюс его, чтобы достигнуть некоторого общего числа в течение 1 часа. Проблема заключается в вычислении крошечных чисел с десятизначным числом после точки, которое имеет неправильную оценку.
Например, мое число равно «0,001».
Я хочу вычислить это число в минутах. Я делаю 0.001 / 60 = 0.0000166667
за 1 минуту. Если умножить 0.0000166667 * 60 = 0.0010000020
за 1 час.
Я хочу вычислить указанное число в секундах.
Я 0.0000166667 / 60 = 0.0000002778
в 1 секунду. Если кратно 0.0000002778 * 60 = 0.0000166680
за 1 минуту. Но результат отличается от 0.0000166667
.
Я хочу вычислить указанное число в миллисекундах. Я делаю 0,0000002778 / 1000 = 0,0000000003 за 1 миллисекунду. Если кратно 0,0000000003 * 1000 = 0,0000003000 в секунду. И снова, результат отличается от 0,0000002778.
<?php
$my_number = 0.001;
$per_one_minute = 0.001 / 60;
echo number_format($per_one_minute, 10)."<br>";
// result 0.0000166667
$reverse = 0.0000166667 * 60;
// expecting 0.0010000000
// result 0.0010000020
$per_one_second = 0.0000166667 / 60;
echo number_format($per_one_second, 10)."<br>";
// result 0.0000002778
$reverse = 0.0000002778 * 60;
// expecting 0.0000166667
// result 0.0000166680
$per_one_millisecond = 0.0000002778 / 1000;
echo number_format($per_one_millisecond, 10)."<br>";
// result 0.0000000003
$reverse = 0.0000000003 * 1000;
// expecting 0.0000002778
// result 0.0000003000
?>
Ожидаемое число отличается от результата, и это проблема. Я использую вычисления PHP в JavaScript следующим образом:
function roundNumberV1(num, scale) {
if (!("" + num).includes("e")) {
return +(Math.round(num + "e+" + scale) + "e-" + scale);
} else {
var arr = ("" + num).split("e");
var sig = ""
if (+arr[1] + scale > 0) {
sig = "+";
}
var i = +arr[0] + "e" + sig + (+arr[1] + scale);
var j = Math.round(i);
var k = +(j + "e-" + scale);
return k;
}
}
function printNumbers(from, to, step) {
let current = from;
let current1 = 1;
let timerId = setInterval(function() {
document.getElementById("mynum").innerHTML = roundNumberV1(current, 10);
if (current >= to) {
clearInterval(timerId);
}
current += step;
}, 100);
}
Где «from» param - это вычисляемое число PHP, «to» - это то, что нужно достичь (в нашем случае 0,001), а «step» - число на 1миллисекунды. Я думаю, что если PHP вычисления точны, Javascript будет отображать правильный номер вычисления в данный момент времени.