Skip to content

Commit 7a46231

Browse files
author
chengyitian
committed
AJ-604: fix issue about decimal matrix;
1 parent 3829eab commit 7a46231

File tree

3 files changed

+12
-7
lines changed

3 files changed

+12
-7
lines changed

src/com/xxdb/data/BasicDecimal128Matrix.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.io.IOException;
66
import java.math.BigDecimal;
77
import java.math.BigInteger;
8+
import java.math.RoundingMode;
89
import java.util.Arrays;
910
import java.util.List;
1011

@@ -51,7 +52,9 @@ public BasicDecimal128Matrix(int rows, int columns, List<?> listOfArrays, int sc
5152
for (int j = 0; j < newArray.length; j ++) {
5253
BigDecimal bd = new BigDecimal(newArray[j]);
5354
Utils.checkDecimal128Range(bd, scale);
54-
tempArr[j] = bd.scaleByPowerOfTen(scale).toBigInteger();
55+
BigDecimal multipliedValue = bd.scaleByPowerOfTen(scale).setScale(0, RoundingMode.HALF_UP);
56+
BigInteger unscaledValue = multipliedValue.toBigInteger();
57+
tempArr[j] = unscaledValue;
5558
}
5659
System.arraycopy(tempArr, 0, values, i * rows, rows);
5760
} else if (array instanceof BigInteger[]) {

src/com/xxdb/data/BasicDecimal32Matrix.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.io.IOException;
66
import java.math.BigDecimal;
77
import java.math.BigInteger;
8+
import java.math.RoundingMode;
89
import java.nio.ByteBuffer;
910
import java.nio.ByteOrder;
1011
import java.util.List;
@@ -43,11 +44,11 @@ public BasicDecimal32Matrix(int rows, int columns, List<?> listOfArrays, int sca
4344
if (newArray.length == 0 || newArray.length != rows)
4445
throw new Exception("The length of array "+ (i+1) + " doesn't have " + rows + " elements");
4546

46-
BigDecimal pow = BigDecimal.TEN.pow(this.scale);
4747
for (int j = 0; j < newArray.length; j ++) {
4848
BigDecimal bd = new BigDecimal(newArray[j]);
49-
if (bd.multiply(pow).intValue() > MIN_VALUE && bd.multiply(pow).intValue() < MAX_VALUE)
50-
tempArr[j] = bd.multiply(pow).intValue();
49+
BigDecimal multipliedValue = bd.scaleByPowerOfTen(scale).setScale(0, RoundingMode.HALF_UP);
50+
if (multipliedValue.intValue() > MIN_VALUE && multipliedValue.intValue() < MAX_VALUE)
51+
tempArr[j] = multipliedValue.intValue();
5152
}
5253
System.arraycopy(tempArr, 0, values, i * rows, rows);
5354
} else if (array instanceof int[]) {

src/com/xxdb/data/BasicDecimal64Matrix.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.io.IOException;
66
import java.math.BigDecimal;
77
import java.math.BigInteger;
8+
import java.math.RoundingMode;
89
import java.nio.ByteBuffer;
910
import java.nio.ByteOrder;
1011
import java.util.List;
@@ -43,11 +44,11 @@ public BasicDecimal64Matrix(int rows, int columns, List<?> listOfArrays, int sca
4344
if (newArray.length == 0 || newArray.length != rows)
4445
throw new Exception("The length of array "+ (i+1) + " doesn't have " + rows + " elements");
4546

46-
BigDecimal pow = BigDecimal.TEN.pow(this.scale);
4747
for (int j = 0; j < newArray.length; j ++) {
4848
BigDecimal bd = new BigDecimal(newArray[j]);
49-
if (bd.multiply(pow).longValue() > MIN_VALUE && bd.multiply(pow).longValue() < MAX_VALUE)
50-
tempArr[j] = bd.multiply(pow).longValue();
49+
BigDecimal multipliedValue = bd.scaleByPowerOfTen(scale).setScale(0, RoundingMode.HALF_UP);
50+
if (multipliedValue.longValue() > MIN_VALUE && multipliedValue.longValue() < MAX_VALUE)
51+
tempArr[j] = multipliedValue.longValue();
5152
}
5253
System.arraycopy(tempArr, 0, values, i * rows, rows);
5354
} else if (array instanceof long[]) {

0 commit comments

Comments
 (0)