< prev index next >

## src/java.base/share/classes/java/math/BigDecimal.java

Print this page

```@@ -1,7 +1,7 @@
/*
- * Copyright (c) 1996, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1996, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.  Oracle designates this
```

```@@ -3412,36 +3412,13 @@
* @return this {@code BigDecimal} converted to a {@code long}.
* @jls 5.1.3 Narrowing Primitive Conversion
*/
@Override
public long longValue(){
-        if (intCompact != INFLATED && scale == 0) {
-            return intCompact;
-        } else {
-            // Fastpath zero and small values
-            if (this.signum() == 0 || fractionOnly() ||
-                // Fastpath very large-scale values that will result
-                // in a truncated value of zero. If the scale is -64
-                // or less, there are at least 64 powers of 10 in the
-                // value of the numerical result. Since 10 = 2*5, in
-                // that case there would also be 64 powers of 2 in the
-                // result, meaning all 64 bits of a long will be zero.
-                scale <= -64) {
-                return 0;
-            } else {
-                return toBigInteger().longValue();
-            }
-        }
-    }
-
-    /**
-     * Return true if a nonzero BigDecimal has an absolute value less
-     * than one; i.e. only has fraction digits.
-     */
-    private boolean fractionOnly() {
-        assert this.signum() != 0;
-        return (this.precision() - this.scale) <= 0;
+        return (intCompact != INFLATED && scale == 0) ?
+            intCompact:
+            toBigInteger().longValue();
}

/**
* Converts this {@code BigDecimal} to a {@code long}, checking
* for lost information.  If this {@code BigDecimal} has a
```

```@@ -3455,24 +3432,19 @@
* @since  1.5
*/
public long longValueExact() {
if (intCompact != INFLATED && scale == 0)
return intCompact;
-
-        // Fastpath zero
-        if (this.signum() == 0)
-            return 0;
-
-        // Fastpath numbers less than 1.0 (the latter can be very slow
-        // to round if very small)
-        if (fractionOnly())
-            throw new ArithmeticException("Rounding necessary");
-
// If more than 19 digits in integer part it cannot possibly fit
if ((precision() - scale) > 19) // [OK for negative scale too]
throw new java.lang.ArithmeticException("Overflow");
-
+        // Fastpath zero and < 1.0 numbers (the latter can be very slow
+        // to round if very small)
+        if (this.signum() == 0)
+            return 0;
+        if ((this.precision() - this.scale) <= 0)
+            throw new ArithmeticException("Rounding necessary");
// round to an integer, with Exception if decimal part non-0
BigDecimal num = this.setScale(0, ROUND_UNNECESSARY);
if (num.precision() >= 19) // need to check carefully
LongOverflow.check(num);
return num.inflated().longValue();
```

```@@ -3512,11 +3484,11 @@
*/
@Override
public int intValue() {
return  (intCompact != INFLATED && scale == 0) ?
(int)intCompact :
-            (int)longValue();
+            toBigInteger().intValue();
}

/**
* Converts this {@code BigDecimal} to an {@code int}, checking
* for lost information.  If this {@code BigDecimal} has a
```
< prev index next >