Php float количество знаков

Числа с плавающей точкой

Числа с плавающей точкой (также известные как «float», «double», или «real») могут быть определены следующими синтаксисами:

LNUM 4+ DNUM (7*[\.]) | ([\.]3*) EXPONENT_DNUM [+-]?(( | ) [eE][+-]? )

Размер числа с плавающей точкой зависит от платформы, хотя максимум, как правило составляет ~1.8e308 с точностью около 14 десятичных цифр (64-битный IEEE формат).

Точность чисел с плавающей точкой

Числа с плавающей точкой имеют ограниченную точность. Хотя это зависит от операционной системы, в PHP обычно используется формат двойной точности IEEE 754, дающий максимальную относительную ошибку округления порядка 1.11e-16. Неэлементарные арифметические операции могут давать большие ошибки, и, разумеется, необходимо принимать во внимание распространение ошибок при совместном использовании нескольких операций.

Кроме того, рациональные числа, которые могут быть точно представлены в виде чисел с плавающей точкой с основанием 10, например, 0.1 или 0.7, не имеют точного внутреннего представления в качестве чисел с плавающей точкой с основанием 2, вне зависимости от размера мантиссы. Поэтому они и не могут быть преобразованы в их внутреннюю двоичную форму без небольшой потери точности. Это может привести к неожиданным результатам: например, floor((0.1+0.7)*10) скорее всего вернет 7 вместо ожидаемого 8, так как результат внутреннего представления будет чем-то вроде 7.9999999999999991118. .

Так что никогда не доверяйте точности чисел с плавающей точкой до последней цифры, и не проверяйте напрямую их равенство. Если вам действительно необходима высокая точность, используйте математические функции произвольной точности и gmp-функции.

Читайте также:  Audio module for python

«Простое» объяснение можно найти в » руководстве по числам с плавающей точкой, которое также называется «Why don’t my numbers add up?» («Почему мои числа не складываются?»)

Преобразование в число с плавающей точкой

Информацию о преобразовании строк в числа с плавающей точкой смотрите в разделе Преобразование строк в числа. Для значений других типов преобразование будет сначала осуществлено в в integer и затем в число с плавающей точкой. Дополнительную информацию смотрите в разделе Преобразование к целому. Начиная с версии PHP 5, при преобразовании объекта к числу с плавающей точкой выводится замечание об ошибке.

Сравнение чисел с плавающей точкой

Как указано выше, проверять числа с плавающей точкой на равенство проблематично из-за их внутреннего представления. Тем не менее, существуют способы для их сравнения, которые работают несмотря на все эти ограничения.

Для сравнения чисел с плавающей точкой используется верхняя граница относительной ошибки при округлении. Эта величина называется машинной эпсилон или единица округления(unit roundoff) и представляет собой самую маленькую допустимую разницу при расчетах.

$a и $b равны до 5-ти знаков после запятой.

$a = 1.23456789 ;
$b = 1.23456780 ;
$epsilon = 0.00001 ;

NaN

Некоторые числовые операции могут возвращать значение, представляемое константой NAN . Данный результат означает неопределенное или непредставимое значение в операциях с плавающей точкой. Любое строгое или нестрогое сравнение данного значения с другим значением, включая его самого, возвратит FALSE .

Так как NAN представляет собой неограниченное количество различных значений, то NAN не следует сравнивать с другими значениями, включая ее саму. Вместо этого, для определения ее наличия необходимо использовать функцию is_nan() .

Источник

number_format

Форматирует число сгруппированными тысячными и, возможно, десятичными цифрами, используя математическое правило округления.

Список параметров

Устанавливает число знаков после запятой. Если 0 , decimal_separator опускается в возвращаемом значении.

Устанавливает разделитель дробной части.

Устанавливает разделитель тысяч.

Возвращаемые значения

Отформатированное число num .

Список изменений

Версия Описание
8.0.0 До этой версии функция number_format() принимала один, два или четыре параметра (но не три).
7.2.0 number_format() была изменена, чтобы не возвращать -0 , ранее -0 могло быть возвращено в случаях, когда num был -0.01 .

Примеры

Пример #1 Пример использования number_format()

Во Франции обычно используются 2 знака после запятой (‘,’), и пробел (‘ ‘) в качестве разделителя групп. Этот пример демонстрирует различные способы форматирования чисел:

// английский формат (по умолчанию)
$english_format_number = number_format ( $number );
// 1,235

// французский формат
$nombre_format_francais = number_format ( $number , 2 , ‘,’ , ‘ ‘ );
// 1 234,56

// английский формат без разделителей групп
$english_format_number = number_format ( $number , 2 , ‘.’ , » );
// 1234.57

Смотрите также

  • money_format() — Форматирует число как денежную величину
  • sprintf() — Возвращает отформатированную строку
  • printf() — Выводит отформатированную строку
  • sscanf() — Разбирает строку в соответствии с заданным форматом

User Contributed Notes 9 notes

It’s not explicitly documented; number_format also rounds:

$numbers = array( 0.001 , 0.002 , 0.003 , 0.004 , 0.005 , 0.006 , 0.007 , 0.008 , 0.009 );
foreach ( $numbers as $number )
print $number . «->» . number_format ( $number , 2 , ‘.’ , ‘,’ ). «
» ;
?>

0.001->0.00
0.002->0.00
0.003->0.00
0.004->0.00
0.005->0.01
0.006->0.01
0.007->0.01
0.008->0.01
0.009->0.01

Note: use NumberFormatter to convert in human-readable format instead user function from comments:
echo NumberFormatter :: create ( ‘en’ , NumberFormatter :: SPELLOUT )-> format ( 12309 ); // twelve thousand three hundred nine
echo NumberFormatter :: create ( ‘ru’ , NumberFormatter :: SPELLOUT )-> format ( 12307.5 ); // двенадцать тысяч триста семь целых пять десятых
?>

If you want to display a number ending with ,- (like 200,-) when there are no decimal characters and display the decimals when there are decimal characters i use:

function DisplayDouble($value)
list($whole, $decimals) = split (‘[.,]’, $value, 2);
if (intval($decimals) > 0)
return number_format($value,2,».»,»,»);
else
return number_format($value,0,».»,»,») .»,-«;
>

Outputs a human readable number.

# Output easy-to-read numbers
# by james at bandit.co.nz
function bd_nice_number ( $n ) // first strip any formatting;
$n = ( 0 + str_replace ( «,» , «» , $n ));

// is this a number?
if(! is_numeric ( $n )) return false ;

// now filter it;
if( $n > 1000000000000 ) return round (( $n / 1000000000000 ), 1 ). ‘ trillion’ ;
else if( $n > 1000000000 ) return round (( $n / 1000000000 ), 1 ). ‘ billion’ ;
else if( $n > 1000000 ) return round (( $n / 1000000 ), 1 ). ‘ million’ ;
else if( $n > 1000 ) return round (( $n / 1000 ), 1 ). ‘ thousand’ ;

return number_format ( $n );
>
?>

Outputs:

247,704,360 -> 247.7 million
866,965,260,000 -> 867 billion

For Zero fill — just use the sprintf() function

$pr_id = 1;
$pr_id = sprintf(«%03d», $pr_id);
echo $pr_id;

$pr_id = 10;
$pr_id = sprintf(«%03d», $pr_id);
echo $pr_id;

You can change %03d to %04d, etc.

I ran across an issue where I wanted to keep the entered precision of a real value, without arbitrarily rounding off what the user had submitted.

I figured it out with a quick explode on the number before formatting. I could then format either side of the decimal.

function number_format_unlimited_precision ( $number , $decimal = ‘.’ )
$broken_number = explode ( $decimal , $number );
return number_format ( $broken_number [ 0 ]). $decimal . $broken_number [ 1 ];
>
?>

formatting numbers may be more easy if u use number_format function.

I also wrote this :
function something($number)
$locale = localeconv();
return number_format($number,
$locale[‘frac_digits’],
$locale[‘decimal_point’],
$locale[‘thousands_sep’]);
>

My simpler solution to the problem of the decimal number in this function being longer than the specified number of decimals.

Standard result for number_format() is..
number_format(5.00098, 2) = 5.00

My function will return the result = 5.001

// ** Warning: Does not work with scientific notation. Conversion to a real number is required. **

echo auto_decimal_format ( 5.0005620 ); // print 5.0006
echo auto_decimal_format ( 5.0009820 ); // print 5.001
echo auto_decimal_format ( 5.00098 , 8 ); // print 5.00098000
echo auto_decimal_format ( 1.0295691366783E-5 , 2 ); // print 0.00

function auto_decimal_format ( $n , $def = 2 ) $a = explode ( «.» , $n );
if ( count ( $a )> 1 ) $b = str_split ( $a [ 1 ]);
$pos = 1 ;
foreach ( $b as $value ) if ( $value != 0 && $pos >= $def ) $c = number_format ( $n , $pos );
$c_len = strlen ( substr ( strrchr ( $c , «.» ), 1 ));
if ( $c_len > $def ) < return rtrim ( $c , 0 ); >
return $c ; // or break
>
$pos ++;
>
>
return number_format ( $n , $def );
>

To prevent the rounding that occurs when next digit after last significant decimal is 5 (mentioned by several people below):

function fnumber_format ( $number , $decimals = » , $sep1 = » , $sep2 = » )

if (( $number * pow ( 10 , $decimals + 1 ) % 10 ) == 5 ) //if next not significant digit is 5
$number -= pow ( 10 , -( $decimals + 1 ));

return number_format ( $number , $decimals , $sep1 , $sep2 );

$t = 7.15 ;
echo $t . » | » . number_format ( $t , 1 , ‘.’ , ‘,’ ) . » | » . fnumber_format ( $t , 1 , ‘.’ , ‘,’ ) . «\n\n» ;
//result is: 7.15 | 7.2 | 7.1

$t = 7.3215 ;
echo $t . » | » . number_format ( $t , 3 , ‘.’ , ‘,’ ) . » | » . fnumber_format ( $t , 3 , ‘.’ , ‘,’ ) . «\n\n» ;
//result is: 7.3215 | 7.322 | 7.321
> ?>

have fun!

Источник

Точность с плавающей точкой

Числа с плавающей точкой имеют ограниченную точность.Хотя это зависит от системы,PHP обычно использует формат двойной точности IEEE 754,который дает максимальную относительную ошибку из-за округления в порядке 1.11e-16.Неэлементарные арифметические операции могут давать большие ошибки,и,конечно,распространение ошибок должно учитываться при сложении нескольких операций.

Кроме того, рациональные числа, которые точно могут быть представлены в виде чисел с плавающей запятой в базе 10, например 0.1 или 0.7 , не имеют точного представления в виде чисел с плавающей запятой в базе 2, которые используются внутренне, независимо от размера мантиссы. Следовательно, они не могут быть преобразованы в их внутренние двоичные аналоги без небольшой потери точности. Это может привести к неожиданным результатам: например, floor((0.1+0.7)*10) , как правило , возвращают 7 вместо ожидаемого 8 , так как внутреннее представление будет что — то вроде 7.9999999999999991118. .

Поэтому никогда не доверяйте результату с плавающей запятой до последней цифры и не сравнивайте числа с плавающей запятой напрямую на предмет равенства. Если необходима более высокая точность, доступны математические функции произвольной точности и функции gmp .

«Простое» объяснение см. в » руководстве по плавающей запятой , также озаглавленном «Почему мои числа не складываются?»

Преобразование в плавучее средство

From strings

Если строка является числовой или ведущей числовой, она будет преобразована в соответствующее значение с плавающей запятой, в противном случае она преобразуется в ноль ( 0 ).

От других типов

Для значений других типов преобразование выполняется путем преобразования значения сначала в int, а затем в float. Дополнительные сведения см. В разделе « Преобразование в целое число» .

Note:

Поскольку некоторые типы имеют неопределенное поведение при преобразовании в int,это также происходит и при преобразовании в float.

Comparing floats

Как отмечалось в приведенном выше предупреждении,проверка значений с плавающей запятой на равенство проблематична в связи с тем,что они представлены внутри организации.Тем не менее,существуют способы проведения сравнения значений с плавающей запятой,которые работают вокруг этих ограничений.

Для проверки значений с плавающей точкой на равенство используется верхняя граница относительной погрешности из-за округления.Это значение известно как машинное эпсилонное,или единичное округление,и является наименьшим допустимым отклонением в расчетах.

$a Точность $ a и $b равна 5 знакам точности.

 $a = 1.23456789; $b = 1.23456780; $epsilon = 0.00001; if(abs($a-$b) < $epsilon) < echo "true"; > ?>

NaN

Некоторые числовые операции могут привести к значению, представленному константой NAN . Этот результат представляет собой неопределенное или непредставимое значение в вычислениях с плавающей запятой. Любое слабое или строгое сравнение этого значения с любым другим значением, включая его самого, но кроме true , приведет к false результату .

Поскольку NAN представляет любое количество различных значений, NAN не следует сравнивать с другими значениями, включая саму себя, и вместо этого следует проверять использование is_nan () .

PHP 8.2

Объявления типов могут быть добавлены к аргументам функций,возвращаемым значениям и,начиная с версии PHP 7.4.0,к свойствам классов.

Перечисления-это ограничивающий слой поверх классов и констант,предназначенный для определения закрытого набора возможных значений типа.

Инт-это число из набора ℤ -2,-1,0,См.также:Инты могут быть заданы в десятичной (основание 10),шестнадцатеричной 16),восьмеричной 8)или двоичной 2)системе счисления.

Источник

Оцените статью