[ 
https://issues.apache.org/jira/browse/NUMBERS-217?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Alex Herbert updated NUMBERS-217:
---------------------------------
    Description: 
Allow rounding of a BigFraction to BigDecimal using a MathContext.

Current rounding uses a scale passed to BigDecimal divide. This allows the 
number of digits after the decimal point to be specified. However this requires 
knowledge of the current decimal representation of the number to obtain a 
BigDecimal floating-point representation with a desired number of digits of 
precision. 

The MathContext allows the digits of precision to be set, rather than the 
number of digits after the decimal place:
{code:java}
// 1e-20
BigFraction f = BigFraction.of(
    BigInteger.ONE, 
    new BigInteger("100000000000000000000")
);

// 16 digits after the decimal place is not enough
System.out.println(f.bigDecimalValue(16, RoundingMode.HALF_EVEN));
// 16 digits of precision is OK
System.out.println(f.bigDecimalValue(MathContext.DECIMAL64));

// Smaller than 1e-20
BigFraction f1 = BigFraction.of(
    BigInteger.ONE,
    new BigInteger("100000000000000000001")
);

System.out.println(f1.bigDecimalValue(MathContext.DECIMAL64));
// More precision
System.out.println(f1.bigDecimalValue(MathContext.DECIMAL128));
// Not a representable double
System.out.println(f1.bigDecimalValue(MathContext.DECIMAL128).doubleValue());{code}
Prints:
{noformat}
0E-10
1E-20

1.000000000000000E-20
9.999999999999999999900000000000000E-21
1.0E-20{noformat}
 

  was:
Allow rounding of a BigFraction to BigDecimal using a MathContext.

Current rounding uses a scale passed to BigDecimal divide. This allows the 
number of digits after the decimal point to be specified. However this requires 
knowledge of the current decimal representation of the number to obtain a 
BigDecimal floating-point representation with a desired number of digits of 
precision. 

The MathContext allows the digits of precision to be set, rather than the 
number of digits after the decimal place:
{code:java}
// 1e-20 is a representable double
BigFraction f = BigFraction.of(
    BigInteger.ONE, 
    new BigInteger("100000000000000000000")
);

// 16 digits after the decimal place is not enough
System.out.println(f.bigDecimalValue(16, RoundingMode.HALF_EVEN));
// 16 digits of precision is OK
System.out.println(f.bigDecimalValue(MathContext.DECIMAL64));

// This is not a representable double
BigFraction f1 = BigFraction.of(
    BigInteger.ONE,
    new BigInteger("100000000000000000001")
);

System.out.println(f1.bigDecimalValue(MathContext.DECIMAL64));
// More precision
System.out.println(f1.bigDecimalValue(MathContext.DECIMAL128));
// Not a representable double
System.out.println(f1.bigDecimalValue(MathContext.DECIMAL128).doubleValue());{code}
Prints:
{noformat}
0E-10
1E-20

1.000000000000000E-20
9.999999999999999999900000000000000E-21
1.0E-20{noformat}
 


> BigFraction to round using a MathContext
> ----------------------------------------
>
>                 Key: NUMBERS-217
>                 URL: https://issues.apache.org/jira/browse/NUMBERS-217
>             Project: Commons Numbers
>          Issue Type: New Feature
>          Components: fraction
>            Reporter: Alex Herbert
>            Priority: Trivial
>
> Allow rounding of a BigFraction to BigDecimal using a MathContext.
> Current rounding uses a scale passed to BigDecimal divide. This allows the 
> number of digits after the decimal point to be specified. However this 
> requires knowledge of the current decimal representation of the number to 
> obtain a BigDecimal floating-point representation with a desired number of 
> digits of precision. 
> The MathContext allows the digits of precision to be set, rather than the 
> number of digits after the decimal place:
> {code:java}
> // 1e-20
> BigFraction f = BigFraction.of(
>     BigInteger.ONE, 
>     new BigInteger("100000000000000000000")
> );
> // 16 digits after the decimal place is not enough
> System.out.println(f.bigDecimalValue(16, RoundingMode.HALF_EVEN));
> // 16 digits of precision is OK
> System.out.println(f.bigDecimalValue(MathContext.DECIMAL64));
> // Smaller than 1e-20
> BigFraction f1 = BigFraction.of(
>     BigInteger.ONE,
>     new BigInteger("100000000000000000001")
> );
> System.out.println(f1.bigDecimalValue(MathContext.DECIMAL64));
> // More precision
> System.out.println(f1.bigDecimalValue(MathContext.DECIMAL128));
> // Not a representable double
> System.out.println(f1.bigDecimalValue(MathContext.DECIMAL128).doubleValue());{code}
> Prints:
> {noformat}
> 0E-10
> 1E-20
> 1.000000000000000E-20
> 9.999999999999999999900000000000000E-21
> 1.0E-20{noformat}
>  



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to