sprintf() для усечения, а не для округления числа с плавающей запятой до x знаков после запятой?

При расчете дифференциала гандикапа в гольфе вы должны урезать ответ до 1 знака после запятой без округления. Не знаю, почему, но...

Я знаю, как это сделать, используя TRUNCATE() в mySQL.

 SELECT TRUNCATE( 2.365, 1 );
// outputs 2.3

но мне было интересно, может ли sprintf() это сделать? Единственный известный мне способ работы с десятичными знаками в поплавке - это...

echo sprintf("%.1f", 2.365);
// outputs 2.4

person jerrygarciuh    schedule 13.11.2009    source источник


Ответы (2)


Это на каком языке? Предполагая, что это C или одна из его производных, и предполагая, что вам всегда нужен ровно один десятичный знак, и предполагая, что ваши значения всегда неотрицательны, вы можете сделать это:

float val = 12.3456;
val = floor(val*10.0)/10.0;
sprintf("%.1f", val);

Есть ли способ лучше? Вероятно. Это только то, что приходит на ум.

person Darryl    schedule 13.11.2009
comment
В PHP $val = 12.3456; $val = floor($val,1); $val = sprintf("%.1f",$val); - person Timo Huovinen; 08.05.2013

Мне проще использовать строковые операции: позволить sprintf округлить до дополнительной значащей цифры, обрезать, а затем преобразовать обратно в число с плавающей запятой.

    function truncate_float(float $float, int $significantDigits = 4): float
    {
        $format = sprintf('%%.%df', $significantDigits + 1);

        return (float) substr(sprintf($format, $float), 0, -1);
    }
person wesnick    schedule 06.10.2020