Как посчитать числа с 10 цифрами после точки в PHP - PullRequest
0 голосов
/ 10 ноября 2019

Я хочу сделать простой счетчик, который будет вычислять число каждую миллисекунду плюс его, чтобы достигнуть некоторого общего числа в течение 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 будет отображать правильный номер вычисления в данный момент времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...