How to round a floating point number up to a certain decimal place?
8.833333333339
(or 8.833333333333334
, the result of 106.00/12
) properly rounded to two decimal places is 8.83
. Mathematically it sounds like what you want is a ceiling function. The one in Python's math
module is named ceil
:
import math
v = 8.8333333333333339
print(math.ceil(v*100)/100) # -> 8.84
Respectively, the floor and ceiling functions generally map a real number to the largest previous or smallest following integer which has zero decimal places — so to use them for 2 decimal places the number is first multiplied by 102 (or 100) to shift the decimal point and is then divided by it afterwards to compensate.
If you don't want to use the math
module for some reason, you can use this (minimally tested) implementation I just wrote:
def ceiling(x):
n = int(x)
return n if n-1 < x <= n else n+1
How all this relates to the linked Loan and payment calculator problem:
From the sample output it appears that they rounded up the monthly payment, which is what many call the effect of the ceiling function. This means that each month a little more than 1⁄12 of the total amount is being paid. That made the final payment a little smaller than usual — leaving a remaining unpaid balance of only 8.76
.
It would have been equally valid to use normal rounding producing a monthly payment of 8.83
and a slightly higher final payment of 8.87
. However, in the real world people generally don't like to have their payments go up, so rounding up each payment is the common practice — it also returns the money to the lender more quickly.
Round a float to a specific number of decimal places
So I didn't quite find a real solution to this, but I realised something :
Printf already does the job, but not exactly how I wanted.
Let's say I want to round 1.445, it will display 1.44. But if the number was 1.446, then it would have displayed 1.45.
Not exactly what I wanted, but close enough.
How to round a number to n decimal places in Java
Use setRoundingMode
, set the RoundingMode
explicitly to handle your issue with the half-even round, then use the format pattern for your required output.
Example:
DecimalFormat df = new DecimalFormat("#.####");
df.setRoundingMode(RoundingMode.CEILING);
for (Number n : Arrays.asList(12, 123.12345, 0.23, 0.1, 2341234.212431324)) {
Double d = n.doubleValue();
System.out.println(df.format(d));
}
gives the output:
12
123.1235
0.23
0.1
2341234.2125
EDIT: The original answer does not address the accuracy of the double values. That is fine if you don't care much whether it rounds up or down. But if you want accurate rounding, then you need to take the expected accuracy of the values into account. Floating point values have a binary representation internally. That means that a value like 2.7735 does not actually have that exact value internally. It can be slightly larger or slightly smaller. If the internal value is slightly smaller, then it will not round up to 2.7740. To remedy that situation, you need to be aware of the accuracy of the values that you are working with, and add or subtract that value before rounding. For example, when you know that your values are accurate up to 6 digits, then to round half-way values up, add that accuracy to the value:
Double d = n.doubleValue() + 1e-6;
To round down, subtract the accuracy.
How to round to 2 decimals with Python?
You can use the round
function, which takes as its first argument the number and the second argument is the precision after the decimal point.
In your case, it would be:
answer = str(round(answer, 2))
How does one round a floating point number to a specified number of digits?
If you want this just for display purposes, use the formatting syntax built into println!()
. For example, to print a number rounded to 2 decimal places use the {:.2}
format specifier:
fn main() {
let x = 12.34567;
println!("{:.2}", x);
}
If you want to put the rounded number in a string, use the format!()
macro.
If you want to round a number and get the result back as another number, then multiply the number by the given power of 10, call round
, and divide by the same power, e.g. to round to 2 decimal places, use 102 = 100.
fn main() {
let x = 12.34567_f64;
let y = (x * 100.0).round() / 100.0;
println!("{:.5} {:.5}", x, y);
}
playground
This prints 12.34567 12.35000
.
If the number of decimal places isn't known at compile time, one could use powi
to efficiently compute the relevant power.
Note that this will breakdown for very large numbers; specifically, numbers larger than std::f64::MAX / power
(where power
is the power of ten, e.g. 100 in the example above) will become infinity in the multiplication, and remain infinity after. However, f64
cannot represent any fractional places for numbers larger than 253 (i.e. they're always integers), so one can special case such large numbers to just return themselves.
Rounding a double value to x number of decimal places in swift
You can use Swift's round
function to accomplish this.
To round a Double
with 3 digits precision, first multiply it by 1000, round it and divide the rounded result by 1000:
let x = 1.23556789
let y = Double(round(1000 * x) / 1000)
print(y) /// 1.236
Unlike any kind of printf(...)
or String(format: ...)
solutions, the result of this operation is still of type Double
.
EDIT:
Regarding the comments that it sometimes does not work, please read this: What Every Programmer Should Know About Floating-Point Arithmetic
Round float to x decimals?
Use the built-in function round()
:
In [23]: round(66.66666666666,4)
Out[23]: 66.6667
In [24]: round(1.29578293,6)
Out[24]: 1.295783
help on round()
:
round(number[, ndigits]) -> floating point number
Round a number to a given precision in decimal digits (default 0
digits). This always returns a floating point number. Precision may
be negative.
Related Topics
Call a Function with Argument List in Python
Why Can't Python Find Shared Objects That Are in Directories in Sys.Path
How to Link Pycharm with Pyspark
Difference Between Multiple If's and Elif'S
Getting List of Lists into Pandas Dataframe
Vscode -- How to Set Working Directory for Debugging a Python Program
How to Pickle a Python Function (Or Otherwise Serialize Its Code)
How to Redirect Stdout to Both File and Console with Scripting
How to Validate a Date String Format in Python
Ipython Reads Wrong Python Version
How to Stop a Looping Thread in Python
How to Import a Python Class That Is in a Directory Above
How to Print Variable and String on Same Line in Python
Running Windows Shell Commands with Python
Is It Ok to Use Dashes in Python Files When Trying to Import Them