Cldr.Math.round_significant
round_significant
, go back to Cldr.Math module for more information.
Specs
round_significant(number_or_decimal(), integer()) :: number_or_decimal()
Rounds a number to a specified number of significant digits.
This is not the same as rounding fractional digits which is performed
by Decimal.round/2
and Float.round
number
is a float, integer or Decimaln
is the number of significant digits to which thenumber
should be rounded
Examples
iex> Cldr.Math.round_significant(3.14159, 3)
3.14
iex> Cldr.Math.round_significant(10.3554, 1)
10.0
iex> Cldr.Math.round_significant(0.00035, 1)
0.0004
iex> Cldr.Math.round_significant(Decimal.from_float(3.342742283480345e27), 7)
#Decimal<3.342742E+27>
Notes about precision
Since floats cannot accurately represent all decimal numbers, so rounding to significant digits for a float cannot always return the expected results. For example:
=> Cldr.Math.round_significant(3.342742283480345e27, 7)
Expected result: 3.342742e27
Actual result: 3.3427420000000003e27
Use of Decimal
numbers avoids this issue:
=> Cldr.Math.round_significant(Decimal.from_float(3.342742283480345e27), 7)
Expected result: #Decimal<3.342742E+27>
Actual result: #Decimal<3.342742E+27>
More on significant digits
3.14159 has six significant digits (all the numbers give you useful information)
1000 has one significant digit (only the 1 is interesting; you don't know anything for sure about the hundreds, tens, or units places; the zeroes may just be placeholders; they may have rounded something off to get this value)
1000.0 has five significant digits (the ".0" tells us something interesting about the presumed accuracy of the measurement being made: that the measurement is accurate to the tenths place, but that there happen to be zero tenths)
0.00035 has two significant digits (only the 3 and 5 tell us something; the other zeroes are placeholders, only providing information about relative size)
0.000350 has three significant digits (that last zero tells us that the measurement was made accurate to that last digit, which just happened to have a value of zero)
1006 has four significant digits (the 1 and 6 are interesting, and we have to count the zeroes, because they're between the two interesting numbers)
560 has two significant digits (the last zero is just a placeholder)
560.0 has four significant digits (the zero in the tenths place means that the measurement was made accurate to the tenths place, and that there just happen to be zero tenths; the 5 and 6 give useful information, and the other zero is between significant digits, and must therefore also be counted)
Many thanks to Stackoverflow