Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Delete digits after two decimal points, without rounding the value

i have value in php variable like that

$var='2.500000550'; echo $var 

what i want is to delete all decimal points after 2 digits.

like now value of variable will be

$var='2.50'; echo $var 

keep in mind this value is coming from mysql databse

but when i use round php function i got round but i dont need round, i just need to delete all digits after 2 decimal simple.

i have tired, flot() and lot of other option no success.

Thanks

like image 422
air Avatar asked Mar 30 '12 13:03

air


People also ask

How do I get rid of decimals in Excel without rounding?

Method-01: Remove Decimals without Rounding Using TRUNC Function in Excel. Here, we have some time values with decimals, and using the TRUNC function we will remove the decimals without rounding or changing the whole time values.

How do you remove the digits after two decimal places in Excel?

By using a button: Select the cells that you want to format. On the Home tab, click Increase Decimal or Decrease Decimal to show more or fewer digits after the decimal point.


1 Answers

TL;DR:

The PHP native function bcdiv seems to do precisely what is required, and properly.

To simply "truncate" a number, bcdiv($var, 1, 2); where 2 is the number of decimals to preserve (and 1 is the denomenator - dividing the number by 1 allows you to simply truncate the original number to the desired decimal places)

Full Answer (for history)

This turns out to be more elusive than one might think.

After this answer was (incorrectly) upvoted quite a bit, it has come to my attention that even sprintf will round.

Rather than delete this answer, I'm turning it into a more robust explanation / discussion of each proposed solution.

number_format - Incorrect. (rounds)
Try using number format:

$var = number_format($var, 2, '.', '');  // Last two parameters are optional echo $var; // Outputs 2.50 

If you want it to be a number, then simply type-cast to a float:

$var = (float)number_format($var, 2, '.', ''); 

Note: as has been pointed out in the comments, this does in fact round the number.

sprintf - incorrect. (sprintf also rounds)
If not rounding the number is important, then per the answer below, use sprintf:

$var = sprintf("%01.2f", $var); 

floor - not quite! (floor rounds negative numbers)

floor, with some math, will come close to doing what you want:

floor(2.56789 * 100) / 100; // 2.56 

Where 100 represents the precision you want. If you wanted it to three digits, then:

floor(2.56789 * 1000) / 1000; // 2.567 

However, this has a problem with negative numbers. Negative numbers still get rounded, rather than truncated:

floor(-2.56789 * 100) / 100; // -2.57 

"Old" Correct answer: function utilizing floor

So a fully robust solution requires 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 
like image 165
random_user_name Avatar answered Oct 08 '22 19:10

random_user_name