What's happening with PHP's intval() and strval()? - php

So I got this:
$n = "19.99";
echo (int) ($n * 100);
echo (int) strval($n * 100);
That outputs:
1998
1999
And I just don't get it. What happened? $n * 100 is 1999 (float), why aren't they the same then?

Floats don't have arbitrary precision. The result of 19.99 * 100 is actually represented as 1998.9999999999.
If you print that, it'll show as 1999. That's what strval() does. Whereas (int) will floor it down.

Also check...
http://php.net/manual/en/function.ceil.php
http://php.net/manual/en/function.floor.php
http://php.net/manual/en/function.round.php
You will see how everything works.
echo round(9.5, 0, PHP_ROUND_HALF_UP); // 10
echo round(9.5, 0, PHP_ROUND_HALF_DOWN); // 9
echo round(9.5, 0, PHP_ROUND_HALF_EVEN); // 10
echo round(9.5, 0, PHP_ROUND_HALF_ODD); // 9
echo round(8.5, 0, PHP_ROUND_HALF_UP); // 9
echo round(8.5, 0, PHP_ROUND_HALF_DOWN); // 8
echo round(8.5, 0, PHP_ROUND_HALF_EVEN); // 8
echo round(8.5, 0, PHP_ROUND_HALF_ODD); // 9

To multiply two arbitrary precision numbers use bcmul function.
echo (int)(bcmul('19.99', '100')); // 1999
echo (int)(19.99 * 100); // 1998
Note that the two operands of bcmul function are strings because according to php.net :
Passing values of type float to a BCMath function which expects a string as operand may not have the desired effect due to the way PHP converts float values to string, namely that the string may be in exponential notation (what is not supported by BCMath), and that the decimal separator is locale dependend (while BCMath always expects a decimal point).

Related

How can I limit numbers to have no more than 2 decimals on json_encode in PHP [duplicate]

What's the correct way to round a PHP string to two decimal places?
$number = "520"; // It's a string from a database
$formatted_number = round_to_2dp($number);
echo $formatted_number;
The output should be 520.00;
How should the round_to_2dp() function definition be?
You can use number_format():
return number_format((float)$number, 2, '.', '');
Example:
$foo = "105";
echo number_format((float)$foo, 2, '.', ''); // Outputs -> 105.00
This function returns a string.
Use round() (use if you are expecting a number in float format only, else use number_format() as an answer given by Codemwnci):
echo round(520.34345, 2); // 520.34
echo round(520.3, 2); // 520.3
echo round(520, 2); // 520
From the manual:
Description:
float round(float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]]);
Returns the rounded value of val to specified precision (number of digits after the decimal point). precision can also be negative or zero (default).
...
Example #1 round() examples
<?php
echo round(3.4); // 3
echo round(3.5); // 4
echo round(3.6); // 4
echo round(3.6, 0); // 4
echo round(1.95583, 2); // 1.96
echo round(1241757, -3); // 1242000
echo round(5.045, 2); // 5.05
echo round(5.055, 2); // 5.06
?>
Example #2 mode examples
<?php
echo round(9.5, 0, PHP_ROUND_HALF_UP); // 10
echo round(9.5, 0, PHP_ROUND_HALF_DOWN); // 9
echo round(9.5, 0, PHP_ROUND_HALF_EVEN); // 10
echo round(9.5, 0, PHP_ROUND_HALF_ODD); // 9
echo round(8.5, 0, PHP_ROUND_HALF_UP); // 9
echo round(8.5, 0, PHP_ROUND_HALF_DOWN); // 8
echo round(8.5, 0, PHP_ROUND_HALF_EVEN); // 8
echo round(8.5, 0, PHP_ROUND_HALF_ODD); // 9
?>
Alternatively,
$padded = sprintf('%0.2f', $unpadded); // 520 -> 520.00
http://php.net/manual/en/function.round.php
e.g.
echo round(5.045, 2); // 5.05
echo round(5.055, 2); // 5.06
Try:
$number = 1234545454;
echo $english_format_number = number_format($number, 2);
The output will be:
1,234,545,454.00
Use the PHP number_format() function.
For example,
$num = 7234545423;
echo number_format($num, 2);
The output will be:
7,234,545,423.00
You can use the PHP printf or sprintf functions:
Example with sprintf:
$num = 2.12;
echo sprintf("%.3f", $num);
You can run the same without echo as well. Example: sprintf("%.3f", $num);
Output:
2.120
Alternatively, with printf:
echo printf("%.2f", $num);
Output:
2.124
Another more exotic way to solve this issue is to use bcadd() with a dummy value for the $right_operand of 0.
$formatted_number = bcadd($number, 0, 2);
use round(yourValue,decimalPoint) (php manual’s page) or number_format(yourValue,decimalPoint);
number_format() return value as string like this type 1,234.67. so in this case you can not use it for addition or any calculation. if you try then you have to deal with Number Format Error...
In this case round(121222.299000000,2) will be better option.
The result would be 121222.29 ...
bcdiv($number, 1, 2) // 2 varies for digits after the decimal point
This will display exactly two digits after the decimal point.
Advantage:
If you want to display two digits after a float value only and not for int, then use this.
Here I get two decimals after the . (dot) using a function...
function truncate_number($number, $precision = 2) {
// Zero causes issues, and no need to truncate
if (0 == (int)$number) {
return $number;
}
// Are we negative?
$negative = $number / abs($number);
// Cast the number to a positive to solve rounding
$number = abs($number);
// Calculate precision number for dividing / multiplying
$precision = pow(10, $precision);
// Run the math, re-applying the negative value to ensure
// returns correctly negative / positive
return floor( $number * $precision ) / $precision * $negative;
}
Results from the above function:
echo truncate_number(2.56789, 1); // 2.5
echo truncate_number(2.56789); // 2.56
echo truncate_number(2.56789, 3); // 2.567
echo truncate_number(-2.56789, 1); // -2.5
echo truncate_number(-2.56789); // -2.56
echo truncate_number(-2.56789, 3); // -2.567
New Correct Answer
Use the PHP native function bcdiv
echo bcdiv(2.56789, 1, 1); // 2.5
echo bcdiv(2.56789, 1, 2); // 2.56
echo bcdiv(2.56789, 1, 3); // 2.567
echo bcdiv(-2.56789, 1, 1); // -2.5
echo bcdiv(-2.56789, 1, 2); // -2.56
echo bcdiv(-2.56789, 1, 3); // -2.567
$retailPrice = 5.989;
echo number_format(floor($retailPrice*100)/100,2, '.', '');
It will return 5.98 without rounding the number.
Use the PHP number_format() function.
For conditional rounding off ie. show decimal where it's really needed otherwise whole number
123.56 => 12.56
123.00 => 123
$somenumber = 123.56;
$somenumber = round($somenumber,2);
if($somenumber == intval($somenumber))
{
$somenumber = intval($somenumber);
}
echo $somenumber; // 123.56
$somenumber = 123.00;
$somenumber = round($somenumber,2);
if($somenumber == intval($somenumber))
{
$somenumber = intval($somenumber);
}
echo $somenumber; // 123
I make my own.
$decimals = 2;
$number = 221.12345;
$number = $number * pow(10, $decimals);
$number = intval($number);
$number = $number / pow(10, $decimals);
round_to_2dp is a user-defined function, and nothing can be done unless you posted the declaration of that function.
However, my guess is doing this: number_format($number, 2);
$twoDecNum = sprintf('%0.2f', round($number, 2));
The rounding correctly rounds the number and the sprintf forces it to 2 decimal places if it happens to to be only 1 decimal place after rounding.
Adding to other answers, since number_format() will, by default, add thousands separator.
To remove this, do this:
$number = number_format($number, 2, ".", "");
$number = sprintf('%0.2f', $numbers); // 520.89898989 -> 520.89
This will give you 2 number after decimal.
If you want to use two decimal digits in your entire project, you can define:
bcscale(2);
Then the following function will produce your desired result:
$myvalue = 10.165445;
echo bcadd(0, $myvalue);
// result=10.11
But if you don't use the bcscale function, you need to write the code as follows to get your desired result.
$myvalue = 10.165445;
echo bcadd(0, $myvalue, 2);
// result=10.11
To know more
BC Math Functions
bcscale
Number without round
$double = '21.188624';
echo intval($double) . '.' . substr(end(explode('.', $double)), 0, 2);
Here's another solution with strtok and str_pad:
$num = 520.00
strtok(round($num, 2), '.') . '.' . str_pad(strtok('.'), 2, '0')
Choose the number of decimals
Format commas(,)
An option to trim trailing zeros
Once and for all!
function format_number($number,$dec=0,$trim=false){
if($trim){
$parts = explode(".",(round($number,$dec) * 1));
$dec = isset($parts[1]) ? strlen($parts[1]) : 0;
}
$formatted = number_format($number,$dec);
return $formatted;
}
Examples
echo format_number(1234.5,2,true); //returns 1,234.5
echo format_number(1234.5,2); //returns 1,234.50
echo format_number(1234.5); //returns 1,235
That's the same question I came across today and want to round a number and return float value up to a given decimal place and it must not be string (as returned from number_format)
the answer is
echo sprintf('%.' . $decimalPlaces . 'f', round($number, $decimalPlaces));
In case you use math equation like I did you can set it like this:
{math equation="x + y" x=4.4444 y=5.0000 format="%.2f"}

Make a php float to 2 decimal places [duplicate]

What's the correct way to round a PHP string to two decimal places?
$number = "520"; // It's a string from a database
$formatted_number = round_to_2dp($number);
echo $formatted_number;
The output should be 520.00;
How should the round_to_2dp() function definition be?
You can use number_format():
return number_format((float)$number, 2, '.', '');
Example:
$foo = "105";
echo number_format((float)$foo, 2, '.', ''); // Outputs -> 105.00
This function returns a string.
Use round() (use if you are expecting a number in float format only, else use number_format() as an answer given by Codemwnci):
echo round(520.34345, 2); // 520.34
echo round(520.3, 2); // 520.3
echo round(520, 2); // 520
From the manual:
Description:
float round(float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]]);
Returns the rounded value of val to specified precision (number of digits after the decimal point). precision can also be negative or zero (default).
...
Example #1 round() examples
<?php
echo round(3.4); // 3
echo round(3.5); // 4
echo round(3.6); // 4
echo round(3.6, 0); // 4
echo round(1.95583, 2); // 1.96
echo round(1241757, -3); // 1242000
echo round(5.045, 2); // 5.05
echo round(5.055, 2); // 5.06
?>
Example #2 mode examples
<?php
echo round(9.5, 0, PHP_ROUND_HALF_UP); // 10
echo round(9.5, 0, PHP_ROUND_HALF_DOWN); // 9
echo round(9.5, 0, PHP_ROUND_HALF_EVEN); // 10
echo round(9.5, 0, PHP_ROUND_HALF_ODD); // 9
echo round(8.5, 0, PHP_ROUND_HALF_UP); // 9
echo round(8.5, 0, PHP_ROUND_HALF_DOWN); // 8
echo round(8.5, 0, PHP_ROUND_HALF_EVEN); // 8
echo round(8.5, 0, PHP_ROUND_HALF_ODD); // 9
?>
Alternatively,
$padded = sprintf('%0.2f', $unpadded); // 520 -> 520.00
http://php.net/manual/en/function.round.php
e.g.
echo round(5.045, 2); // 5.05
echo round(5.055, 2); // 5.06
Try:
$number = 1234545454;
echo $english_format_number = number_format($number, 2);
The output will be:
1,234,545,454.00
Use the PHP number_format() function.
For example,
$num = 7234545423;
echo number_format($num, 2);
The output will be:
7,234,545,423.00
You can use the PHP printf or sprintf functions:
Example with sprintf:
$num = 2.12;
echo sprintf("%.3f", $num);
You can run the same without echo as well. Example: sprintf("%.3f", $num);
Output:
2.120
Alternatively, with printf:
echo printf("%.2f", $num);
Output:
2.124
Another more exotic way to solve this issue is to use bcadd() with a dummy value for the $right_operand of 0.
$formatted_number = bcadd($number, 0, 2);
use round(yourValue,decimalPoint) (php manual’s page) or number_format(yourValue,decimalPoint);
number_format() return value as string like this type 1,234.67. so in this case you can not use it for addition or any calculation. if you try then you have to deal with Number Format Error...
In this case round(121222.299000000,2) will be better option.
The result would be 121222.29 ...
bcdiv($number, 1, 2) // 2 varies for digits after the decimal point
This will display exactly two digits after the decimal point.
Advantage:
If you want to display two digits after a float value only and not for int, then use this.
Here I get two decimals after the . (dot) using a function...
function truncate_number($number, $precision = 2) {
// Zero causes issues, and no need to truncate
if (0 == (int)$number) {
return $number;
}
// Are we negative?
$negative = $number / abs($number);
// Cast the number to a positive to solve rounding
$number = abs($number);
// Calculate precision number for dividing / multiplying
$precision = pow(10, $precision);
// Run the math, re-applying the negative value to ensure
// returns correctly negative / positive
return floor( $number * $precision ) / $precision * $negative;
}
Results from the above function:
echo truncate_number(2.56789, 1); // 2.5
echo truncate_number(2.56789); // 2.56
echo truncate_number(2.56789, 3); // 2.567
echo truncate_number(-2.56789, 1); // -2.5
echo truncate_number(-2.56789); // -2.56
echo truncate_number(-2.56789, 3); // -2.567
New Correct Answer
Use the PHP native function bcdiv
echo bcdiv(2.56789, 1, 1); // 2.5
echo bcdiv(2.56789, 1, 2); // 2.56
echo bcdiv(2.56789, 1, 3); // 2.567
echo bcdiv(-2.56789, 1, 1); // -2.5
echo bcdiv(-2.56789, 1, 2); // -2.56
echo bcdiv(-2.56789, 1, 3); // -2.567
$retailPrice = 5.989;
echo number_format(floor($retailPrice*100)/100,2, '.', '');
It will return 5.98 without rounding the number.
Use the PHP number_format() function.
For conditional rounding off ie. show decimal where it's really needed otherwise whole number
123.56 => 12.56
123.00 => 123
$somenumber = 123.56;
$somenumber = round($somenumber,2);
if($somenumber == intval($somenumber))
{
$somenumber = intval($somenumber);
}
echo $somenumber; // 123.56
$somenumber = 123.00;
$somenumber = round($somenumber,2);
if($somenumber == intval($somenumber))
{
$somenumber = intval($somenumber);
}
echo $somenumber; // 123
I make my own.
$decimals = 2;
$number = 221.12345;
$number = $number * pow(10, $decimals);
$number = intval($number);
$number = $number / pow(10, $decimals);
round_to_2dp is a user-defined function, and nothing can be done unless you posted the declaration of that function.
However, my guess is doing this: number_format($number, 2);
$twoDecNum = sprintf('%0.2f', round($number, 2));
The rounding correctly rounds the number and the sprintf forces it to 2 decimal places if it happens to to be only 1 decimal place after rounding.
Adding to other answers, since number_format() will, by default, add thousands separator.
To remove this, do this:
$number = number_format($number, 2, ".", "");
$number = sprintf('%0.2f', $numbers); // 520.89898989 -> 520.89
This will give you 2 number after decimal.
If you want to use two decimal digits in your entire project, you can define:
bcscale(2);
Then the following function will produce your desired result:
$myvalue = 10.165445;
echo bcadd(0, $myvalue);
// result=10.11
But if you don't use the bcscale function, you need to write the code as follows to get your desired result.
$myvalue = 10.165445;
echo bcadd(0, $myvalue, 2);
// result=10.11
To know more
BC Math Functions
bcscale
Number without round
$double = '21.188624';
echo intval($double) . '.' . substr(end(explode('.', $double)), 0, 2);
Here's another solution with strtok and str_pad:
$num = 520.00
strtok(round($num, 2), '.') . '.' . str_pad(strtok('.'), 2, '0')
Choose the number of decimals
Format commas(,)
An option to trim trailing zeros
Once and for all!
function format_number($number,$dec=0,$trim=false){
if($trim){
$parts = explode(".",(round($number,$dec) * 1));
$dec = isset($parts[1]) ? strlen($parts[1]) : 0;
}
$formatted = number_format($number,$dec);
return $formatted;
}
Examples
echo format_number(1234.5,2,true); //returns 1,234.5
echo format_number(1234.5,2); //returns 1,234.50
echo format_number(1234.5); //returns 1,235
That's the same question I came across today and want to round a number and return float value up to a given decimal place and it must not be string (as returned from number_format)
the answer is
echo sprintf('%.' . $decimalPlaces . 'f', round($number, $decimalPlaces));
In case you use math equation like I did you can set it like this:
{math equation="x + y" x=4.4444 y=5.0000 format="%.2f"}

PHP round() 0.50 to lower value

is there any way you can round to lower with any number lower than .50 including .50?
For example:
round(1.49) => 1
round(1.51) => 2
round(1.50) => 2
Is there any way to make it like this:
round(1.49) => 1
round(1.51) => 2
round(1.50) => 1
Use PHP_ROUND_HALF_DOWN flag
echo round(1.49, 0, PHP_ROUND_HALF_DOWN);
echo PHP_EOL;
echo round(1.50, 0, PHP_ROUND_HALF_DOWN);
echo PHP_EOL;
echo round(1.51, 0, PHP_ROUND_HALF_DOWN);
Subtract 0.5 from your number and use ceil on the result.
E.g. ceil(1.51 - 0.5) = 2, ceil(1.50 - 0.5) = 1
It's a perversion of the idiomatic way of doing rounding without a round function. The subtraction caters for your wanting to round the 1/2 way point downwards. Extra checks necessary for negatives.

How can I round up a number without php function ceil

I'm trying to build a function that output will be rounded up number. I know there is a php function, but I want to make this function for another purpose.
you want ceil without using ceiling...
intval($number + .5)
this is the same thing, but you are still using a built in function.
EDIT: apparently the above solution does not work as I intended it to in PHP. You can use the round function to similar effect
round($number + .5)
or something similar to another answer:
$n = intval($number + .5);
if($n < $number){
$n++;
}
May this do it?
function newceil($num)
{
$re=intval($num);
if($re<$num) $re++;
return $re
}
You could cut off the fractional part by casting it to an integer and afterwards check, whether the so derived value is smaller or even the initial value.
$input = 3.141592653;
$intVersion = (int) $input;
if($intVersion<$input) $intVersion++;
return $intVersion
If you want to round up/down
You can use round method
/* Using PHP_ROUND_HALF_UP with 1 decimal digit precision */
echo round( 1.55, 1, PHP_ROUND_HALF_UP); // 1.6
echo round( 1.54, 1, PHP_ROUND_HALF_UP); // 1.5
echo round(-1.55, 1, PHP_ROUND_HALF_UP); // -1.6
echo round(-1.54, 1, PHP_ROUND_HALF_UP); // -1.5
/* Using PHP_ROUND_HALF_DOWN with 1 decimal digit precision */
echo round( 1.55, 1, PHP_ROUND_HALF_DOWN); // 1.5
echo round( 1.54, 1, PHP_ROUND_HALF_DOWN); // 1.5
echo round(-1.55, 1, PHP_ROUND_HALF_DOWN); // -1.5
echo round(-1.54, 1, PHP_ROUND_HALF_DOWN); // -1.5
/* Using PHP_ROUND_HALF_EVEN with 1 decimal digit precision */
echo round( 1.55, 1, PHP_ROUND_HALF_EVEN); // 1.6
echo round( 1.54, 1, PHP_ROUND_HALF_EVEN); // 1.5
echo round(-1.55, 1, PHP_ROUND_HALF_EVEN); // -1.6
echo round(-1.54, 1, PHP_ROUND_HALF_EVEN); // -1.5
/* Using PHP_ROUND_HALF_ODD with 1 decimal digit precision */
echo round( 1.55, 1, PHP_ROUND_HALF_ODD); // 1.5
echo round( 1.54, 1, PHP_ROUND_HALF_ODD); // 1.5
echo round(-1.55, 1, PHP_ROUND_HALF_ODD); // -1.5
echo round(-1.54, 1, PHP_ROUND_HALF_ODD); // -1.5
?>
Note: ceil round up
You can use round() and floor() and number_format() for round up number.
echo round(153.751); // 154
echo floor(153.751); // 153
echo number_format(153.751); // 154

Show a number to two decimal places

What's the correct way to round a PHP string to two decimal places?
$number = "520"; // It's a string from a database
$formatted_number = round_to_2dp($number);
echo $formatted_number;
The output should be 520.00;
How should the round_to_2dp() function definition be?
You can use number_format():
return number_format((float)$number, 2, '.', '');
Example:
$foo = "105";
echo number_format((float)$foo, 2, '.', ''); // Outputs -> 105.00
This function returns a string.
Use round() (use if you are expecting a number in float format only, else use number_format() as an answer given by Codemwnci):
echo round(520.34345, 2); // 520.34
echo round(520.3, 2); // 520.3
echo round(520, 2); // 520
From the manual:
Description:
float round(float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]]);
Returns the rounded value of val to specified precision (number of digits after the decimal point). precision can also be negative or zero (default).
...
Example #1 round() examples
<?php
echo round(3.4); // 3
echo round(3.5); // 4
echo round(3.6); // 4
echo round(3.6, 0); // 4
echo round(1.95583, 2); // 1.96
echo round(1241757, -3); // 1242000
echo round(5.045, 2); // 5.05
echo round(5.055, 2); // 5.06
?>
Example #2 mode examples
<?php
echo round(9.5, 0, PHP_ROUND_HALF_UP); // 10
echo round(9.5, 0, PHP_ROUND_HALF_DOWN); // 9
echo round(9.5, 0, PHP_ROUND_HALF_EVEN); // 10
echo round(9.5, 0, PHP_ROUND_HALF_ODD); // 9
echo round(8.5, 0, PHP_ROUND_HALF_UP); // 9
echo round(8.5, 0, PHP_ROUND_HALF_DOWN); // 8
echo round(8.5, 0, PHP_ROUND_HALF_EVEN); // 8
echo round(8.5, 0, PHP_ROUND_HALF_ODD); // 9
?>
Alternatively,
$padded = sprintf('%0.2f', $unpadded); // 520 -> 520.00
http://php.net/manual/en/function.round.php
e.g.
echo round(5.045, 2); // 5.05
echo round(5.055, 2); // 5.06
Try:
$number = 1234545454;
echo $english_format_number = number_format($number, 2);
The output will be:
1,234,545,454.00
Use the PHP number_format() function.
For example,
$num = 7234545423;
echo number_format($num, 2);
The output will be:
7,234,545,423.00
You can use the PHP printf or sprintf functions:
Example with sprintf:
$num = 2.12;
echo sprintf("%.3f", $num);
You can run the same without echo as well. Example: sprintf("%.3f", $num);
Output:
2.120
Alternatively, with printf:
echo printf("%.2f", $num);
Output:
2.124
Another more exotic way to solve this issue is to use bcadd() with a dummy value for the $right_operand of 0.
$formatted_number = bcadd($number, 0, 2);
use round(yourValue,decimalPoint) (php manual’s page) or number_format(yourValue,decimalPoint);
number_format() return value as string like this type 1,234.67. so in this case you can not use it for addition or any calculation. if you try then you have to deal with Number Format Error...
In this case round(121222.299000000,2) will be better option.
The result would be 121222.29 ...
bcdiv($number, 1, 2) // 2 varies for digits after the decimal point
This will display exactly two digits after the decimal point.
Advantage:
If you want to display two digits after a float value only and not for int, then use this.
Here I get two decimals after the . (dot) using a function...
function truncate_number($number, $precision = 2) {
// Zero causes issues, and no need to truncate
if (0 == (int)$number) {
return $number;
}
// Are we negative?
$negative = $number / abs($number);
// Cast the number to a positive to solve rounding
$number = abs($number);
// Calculate precision number for dividing / multiplying
$precision = pow(10, $precision);
// Run the math, re-applying the negative value to ensure
// returns correctly negative / positive
return floor( $number * $precision ) / $precision * $negative;
}
Results from the above function:
echo truncate_number(2.56789, 1); // 2.5
echo truncate_number(2.56789); // 2.56
echo truncate_number(2.56789, 3); // 2.567
echo truncate_number(-2.56789, 1); // -2.5
echo truncate_number(-2.56789); // -2.56
echo truncate_number(-2.56789, 3); // -2.567
New Correct Answer
Use the PHP native function bcdiv
echo bcdiv(2.56789, 1, 1); // 2.5
echo bcdiv(2.56789, 1, 2); // 2.56
echo bcdiv(2.56789, 1, 3); // 2.567
echo bcdiv(-2.56789, 1, 1); // -2.5
echo bcdiv(-2.56789, 1, 2); // -2.56
echo bcdiv(-2.56789, 1, 3); // -2.567
$retailPrice = 5.989;
echo number_format(floor($retailPrice*100)/100,2, '.', '');
It will return 5.98 without rounding the number.
Use the PHP number_format() function.
For conditional rounding off ie. show decimal where it's really needed otherwise whole number
123.56 => 12.56
123.00 => 123
$somenumber = 123.56;
$somenumber = round($somenumber,2);
if($somenumber == intval($somenumber))
{
$somenumber = intval($somenumber);
}
echo $somenumber; // 123.56
$somenumber = 123.00;
$somenumber = round($somenumber,2);
if($somenumber == intval($somenumber))
{
$somenumber = intval($somenumber);
}
echo $somenumber; // 123
I make my own.
$decimals = 2;
$number = 221.12345;
$number = $number * pow(10, $decimals);
$number = intval($number);
$number = $number / pow(10, $decimals);
round_to_2dp is a user-defined function, and nothing can be done unless you posted the declaration of that function.
However, my guess is doing this: number_format($number, 2);
$twoDecNum = sprintf('%0.2f', round($number, 2));
The rounding correctly rounds the number and the sprintf forces it to 2 decimal places if it happens to to be only 1 decimal place after rounding.
Adding to other answers, since number_format() will, by default, add thousands separator.
To remove this, do this:
$number = number_format($number, 2, ".", "");
$number = sprintf('%0.2f', $numbers); // 520.89898989 -> 520.89
This will give you 2 number after decimal.
If you want to use two decimal digits in your entire project, you can define:
bcscale(2);
Then the following function will produce your desired result:
$myvalue = 10.165445;
echo bcadd(0, $myvalue);
// result=10.11
But if you don't use the bcscale function, you need to write the code as follows to get your desired result.
$myvalue = 10.165445;
echo bcadd(0, $myvalue, 2);
// result=10.11
To know more
BC Math Functions
bcscale
Number without round
$double = '21.188624';
echo intval($double) . '.' . substr(end(explode('.', $double)), 0, 2);
Here's another solution with strtok and str_pad:
$num = 520.00
strtok(round($num, 2), '.') . '.' . str_pad(strtok('.'), 2, '0')
Choose the number of decimals
Format commas(,)
An option to trim trailing zeros
Once and for all!
function format_number($number,$dec=0,$trim=false){
if($trim){
$parts = explode(".",(round($number,$dec) * 1));
$dec = isset($parts[1]) ? strlen($parts[1]) : 0;
}
$formatted = number_format($number,$dec);
return $formatted;
}
Examples
echo format_number(1234.5,2,true); //returns 1,234.5
echo format_number(1234.5,2); //returns 1,234.50
echo format_number(1234.5); //returns 1,235
That's the same question I came across today and want to round a number and return float value up to a given decimal place and it must not be string (as returned from number_format)
the answer is
echo sprintf('%.' . $decimalPlaces . 'f', round($number, $decimalPlaces));
In case you use math equation like I did you can set it like this:
{math equation="x + y" x=4.4444 y=5.0000 format="%.2f"}

Categories