Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
水滴come
qlexpress
提交
88718bf4
Q
qlexpress
项目概览
水滴come
/
qlexpress
与 Fork 源项目一致
从无法访问的项目Fork
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Q
qlexpress
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
88718bf4
编写于
3月 19, 2022
作者:
T
taokankan.tk
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
issue#185 高精度问题
上级
cce1f847
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
186 addition
and
37 deletion
+186
-37
src/main/java/com/ql/util/express/OperatorOfNumber.java
src/main/java/com/ql/util/express/OperatorOfNumber.java
+20
-37
src/test/java/com/ql/util/express/test/NumberOperatorCalculatorTest.java
...om/ql/util/express/test/NumberOperatorCalculatorTest.java
+166
-0
未找到文件。
src/main/java/com/ql/util/express/OperatorOfNumber.java
浏览文件 @
88718bf4
...
...
@@ -383,16 +383,7 @@ class PreciseNumberOperator {
result
=
new
BigDecimal
(
op1
.
toString
()).
add
(
new
BigDecimal
(
op2
.
toString
()));
}
}
if
(
result
.
scale
()
==
0
)
{
long
tempLong
=
result
.
longValue
();
if
(
tempLong
<=
Integer
.
MAX_VALUE
&&
tempLong
>=
Integer
.
MIN_VALUE
)
{
return
(
int
)
tempLong
;
}
else
{
return
tempLong
;
}
}
else
{
return
result
;
}
return
basicNumberFormatTransfer
(
result
);
}
public
static
Number
subtractPrecise
(
Number
op1
,
Number
op2
)
{
...
...
@@ -410,16 +401,7 @@ class PreciseNumberOperator {
result
=
new
BigDecimal
(
op1
.
toString
()).
subtract
(
new
BigDecimal
(
op2
.
toString
()));
}
}
if
(
result
.
scale
()
==
0
)
{
long
tempLong
=
result
.
longValue
();
if
(
tempLong
<=
Integer
.
MAX_VALUE
&&
tempLong
>=
Integer
.
MIN_VALUE
)
{
return
(
int
)
tempLong
;
}
else
{
return
tempLong
;
}
}
else
{
return
result
;
}
return
basicNumberFormatTransfer
(
result
);
}
public
static
Number
multiplyPrecise
(
Number
op1
,
Number
op2
)
{
...
...
@@ -437,16 +419,7 @@ class PreciseNumberOperator {
result
=
new
BigDecimal
(
op1
.
toString
()).
multiply
(
new
BigDecimal
(
op2
.
toString
()));
}
}
if
(
result
.
scale
()
==
0
)
{
long
tempLong
=
result
.
longValue
();
if
(
tempLong
<=
Integer
.
MAX_VALUE
&&
tempLong
>=
Integer
.
MIN_VALUE
)
{
return
(
int
)
tempLong
;
}
else
{
return
tempLong
;
}
}
else
{
return
result
;
}
return
basicNumberFormatTransfer
(
result
);
}
public
static
Number
dividePrecise
(
Number
op1
,
Number
op2
)
{
...
...
@@ -467,15 +440,25 @@ class PreciseNumberOperator {
RoundingMode
.
HALF_UP
);
}
}
if
(
result
.
scale
()
==
0
)
{
long
tempLong
=
result
.
longValue
();
if
(
tempLong
<=
Integer
.
MAX_VALUE
&&
tempLong
>=
Integer
.
MIN_VALUE
)
{
return
(
int
)
tempLong
;
}
else
{
return
tempLong
;
return
basicNumberFormatTransfer
(
result
);
}
/**
* 格式转化通用
* @param number
* @return
*/
protected
static
Number
basicNumberFormatTransfer
(
BigDecimal
number
){
if
(
number
.
scale
()
==
0
)
{
if
(
number
.
compareTo
(
new
BigDecimal
(
Integer
.
MAX_VALUE
))
<
1
&&
number
.
compareTo
(
new
BigDecimal
(
Integer
.
MIN_VALUE
))
>
-
1
){
return
number
.
intValue
();
}
else
if
(
number
.
compareTo
(
new
BigDecimal
(
Long
.
MAX_VALUE
))
<
1
&&
number
.
compareTo
(
new
BigDecimal
(
Long
.
MIN_VALUE
))
>
-
1
){
return
number
.
longValue
();
}
else
{
return
number
;
}
}
else
{
return
result
;
return
number
;
}
}
}
src/test/java/com/ql/util/express/test/NumberOperatorCalculatorTest.java
0 → 100644
浏览文件 @
88718bf4
package
com.ql.util.express.test
;
import
com.ql.util.express.DefaultContext
;
import
com.ql.util.express.ExpressRunner
;
import
com.ql.util.express.OperatorOfNumber
;
import
org.junit.Assert
;
import
org.junit.Test
;
import
java.math.BigDecimal
;
/**
* 高精度测试,低精度不能改变原有数据样式
* @throws Exception
*/
public
class
NumberOperatorCalculatorTest
{
@Test
public
void
add
()
throws
Exception
{
//-2147483648,2147483647,-9223372036854775808,9223372036854775807
Object
[]
ob1
=
{
Integer
.
MIN_VALUE
,
Integer
.
MAX_VALUE
,
Long
.
MIN_VALUE
,
Long
.
MAX_VALUE
,
new
BigDecimal
(
Long
.
MAX_VALUE
)};
Object
[]
ob2
=
{-
0.5f
,
0.5f
,-
0.5d
,
0.5d
,
0
,
1
,-
1
,
1.0f
,-
1.0d
,
1.3f
,-
1.3d
,
new
BigDecimal
(
Long
.
MAX_VALUE
)};
Object
result
=
null
;
//Integer测试Float -2147483648.5 BigDecimal True:-2147483648.5
result
=
OperatorOfNumber
.
add
(
ob1
[
0
],
ob2
[
0
],
true
);
Assert
.
assertTrue
(
"ADD CASE1"
,
result
instanceof
BigDecimal
&&
result
.
equals
(
new
BigDecimal
(-
2147483648.5
)));
//Integer测试Double -2147483648.5 BigDecimal True:-2147483648.5
result
=
OperatorOfNumber
.
add
(
ob1
[
0
],
ob2
[
2
],
true
);
Assert
.
assertTrue
(
"ADD CASE2"
,
result
instanceof
BigDecimal
&&
result
.
equals
(
new
BigDecimal
(-
2147483648.5
)));
//0值 -2147483648 Integer True:-2147483648
result
=
OperatorOfNumber
.
add
(
ob1
[
0
],
ob2
[
4
],
true
);
Assert
.
assertTrue
(
"ADD CASE3"
,
result
instanceof
Integer
&&
result
.
equals
(-
2147483648
));
//Integer转Long Ori:2147483648 Long True:2147483648
result
=
OperatorOfNumber
.
add
(
ob1
[
1
],
ob2
[
5
],
true
);
Assert
.
assertTrue
(
"ADD CASE4"
,
result
instanceof
Long
&&
result
.
equals
(
2147483648L
));
//Long测试Float Ori:-9223372036854775808.5 BigDecimal True:-9223372036854775808.5
result
=
OperatorOfNumber
.
add
(
ob1
[
2
],
ob2
[
2
],
true
);
Assert
.
assertTrue
(
"ADD CASE5"
,
result
instanceof
BigDecimal
&&
result
.
equals
(
new
BigDecimal
(-
9223372036854775808L
).
add
(
new
BigDecimal
(-
0.5
))));
//Long溢出 Ori:9223372036854775807 Long False:-9223372036854775809 BigDecimal
result
=
OperatorOfNumber
.
add
(
ob1
[
2
],
ob2
[
6
],
true
);
Assert
.
assertTrue
(
"ADD CASE6"
,
result
instanceof
BigDecimal
&&
result
.
equals
(
new
BigDecimal
(-
9223372036854775808L
).
add
(
new
BigDecimal
(-
1
))));
//Long测试Double Ori:9223372036854775807.5 BigDecimal True:9223372036854775807.5
result
=
OperatorOfNumber
.
add
(
ob1
[
3
],
ob2
[
3
],
true
);
Assert
.
assertTrue
(
"ADD CASE7"
,
result
instanceof
BigDecimal
&&
result
.
equals
(
new
BigDecimal
(
9223372036854775807L
).
add
(
new
BigDecimal
(
0.5
))));
//溢出 Ori:-9223372036854775808 Long False:9223372036854775808 BigDecimal
result
=
OperatorOfNumber
.
add
(
ob1
[
3
],
ob2
[
5
],
true
);
Assert
.
assertTrue
(
"ADD CASE8"
,
result
instanceof
BigDecimal
&&
result
.
equals
(
new
BigDecimal
(
9223372036854775807L
).
add
(
new
BigDecimal
(
1L
))));
//溢出 Ori:-2 Integer False:9223372036854775807+9223372036854775807 BigDecimal
result
=
OperatorOfNumber
.
add
(
ob1
[
4
],
ob2
[
11
],
true
);
Assert
.
assertTrue
(
"ADD CASE9"
,
result
instanceof
BigDecimal
&&
result
.
equals
(
new
BigDecimal
(
9223372036854775807L
).
add
(
new
BigDecimal
(
9223372036854775807L
))));
}
@Test
public
void
subtract
()
throws
Exception
{
//-2147483648,2147483647,-9223372036854775808,9223372036854775807
Object
[]
ob1
=
{
Integer
.
MIN_VALUE
,
Integer
.
MAX_VALUE
,
Long
.
MIN_VALUE
,
Long
.
MAX_VALUE
,
new
BigDecimal
(
Long
.
MIN_VALUE
)};
Object
[]
ob2
=
{-
0.5f
,
0.5f
,-
0.5d
,
0.5d
,
0
,
1
,-
1
,
1.0f
,-
1.0d
,
1.3f
,-
1.3d
,
new
BigDecimal
(
Long
.
MAX_VALUE
)};
Object
result
=
null
;
//Integer测试Float -2147483647.5 BigDecimal True:-2147483647.5
result
=
OperatorOfNumber
.
subtract
(
ob1
[
0
],
ob2
[
0
],
true
);
Assert
.
assertTrue
(
"SUB CASE1"
,
result
instanceof
BigDecimal
&&
result
.
equals
(
new
BigDecimal
(-
2147483647.5
)));
//Integer测试Double -2147483648.5 BigDecimal True:-2147483648.5
result
=
OperatorOfNumber
.
subtract
(
ob1
[
0
],
ob2
[
3
],
true
);
Assert
.
assertTrue
(
"SUB CASE2"
,
result
instanceof
BigDecimal
&&
result
.
equals
(
new
BigDecimal
(-
2147483648.5
)));
//0值 -2147483648 Integer True:-2147483648
result
=
OperatorOfNumber
.
subtract
(
ob1
[
0
],
ob2
[
4
],
true
);
Assert
.
assertTrue
(
"SUB CASE3"
,
result
instanceof
Integer
&&
result
.
equals
(-
2147483648
));
//Integer转Long Ori:2147483648 Long True:2147483648
result
=
OperatorOfNumber
.
subtract
(
ob1
[
1
],
ob2
[
6
],
true
);
Assert
.
assertTrue
(
"SUB CASE4"
,
result
instanceof
Long
&&
result
.
equals
(
2147483648L
));
//Long测试Float Ori:-9223372036854775808.5 BigDecimal True:-9223372036854775808.5
result
=
OperatorOfNumber
.
subtract
(
ob1
[
2
],
ob2
[
1
],
true
);
Assert
.
assertTrue
(
"SUB CASE5"
,
result
instanceof
BigDecimal
&&
result
.
equals
(
new
BigDecimal
(-
9223372036854775808L
).
subtract
(
new
BigDecimal
(
0.5
))));
//Long溢出 Ori:9223372036854775807 Long False:-9223372036854775809 BigDecimal
result
=
OperatorOfNumber
.
subtract
(
ob1
[
2
],
ob2
[
5
],
true
);
Assert
.
assertTrue
(
"SUB CASE6"
,
result
instanceof
BigDecimal
&&
result
.
equals
(
new
BigDecimal
(-
9223372036854775808L
).
subtract
(
new
BigDecimal
(
1L
))));
//Long测试Double Ori:9223372036854775807.5 BigDecimal True:9223372036854775807.5
result
=
OperatorOfNumber
.
subtract
(
ob1
[
3
],
ob2
[
2
],
true
);
Assert
.
assertTrue
(
"SUB CASE7"
,
result
instanceof
BigDecimal
&&
result
.
equals
(
new
BigDecimal
(
9223372036854775807L
).
add
(
new
BigDecimal
(
0.5
))));
//溢出 Ori:1 Integer False:-9223372036854775808-9223372036854775807 BigDecimal
result
=
OperatorOfNumber
.
subtract
(
ob1
[
4
],
ob2
[
11
],
true
);
Assert
.
assertTrue
(
"SUB CASE8"
,
result
instanceof
BigDecimal
&&
result
.
equals
(
new
BigDecimal
(-
9223372036854775808L
).
subtract
(
new
BigDecimal
(
9223372036854775807L
))));
}
@Test
public
void
multiply
()
throws
Exception
{
//-2147483648,2147483647,-9223372036854775808,9223372036854775807
Object
[]
ob1
=
{
Integer
.
MIN_VALUE
,
Integer
.
MAX_VALUE
,
Long
.
MIN_VALUE
,
Long
.
MAX_VALUE
,
new
BigDecimal
(
Long
.
MIN_VALUE
)};
Object
[]
ob2
=
{-
0.5f
,
0.5f
,-
0.5d
,
0.5d
,
0
,
1
,-
1
,
1.0f
,-
1.0d
,
1.3f
,-
1.3d
,
2
,-
2
,
new
BigDecimal
(
2L
)};
Object
result
=
null
;
//Integer测试Float 1073741824.0 BigDecimal True:1073741824.0
result
=
OperatorOfNumber
.
multiply
(
ob1
[
0
],
ob2
[
0
],
true
);
Assert
.
assertTrue
(
"MUL CASE1"
,
result
instanceof
BigDecimal
&&
result
.
equals
(
new
BigDecimal
(
1073741824.0
).
setScale
(
1
)));
//Integer测试Double -1073741824.0 BigDecimal True:-1073741824.0
result
=
OperatorOfNumber
.
multiply
(
ob1
[
0
],
ob2
[
3
],
true
);
Assert
.
assertTrue
(
"MUL CASE2"
,
result
instanceof
BigDecimal
&&
result
.
equals
(
new
BigDecimal
(-
1073741824.0
).
setScale
(
1
)));
//0值 0 Integer True:0
result
=
OperatorOfNumber
.
multiply
(
ob1
[
0
],
ob2
[
4
],
true
);
Assert
.
assertTrue
(
"MUL CASE3"
,
result
instanceof
Integer
&&
result
.
equals
(
0
));
//Integer转Long Ori:4294967294 Long True:4294967294
result
=
OperatorOfNumber
.
multiply
(
ob1
[
1
],
ob2
[
11
],
true
);
//Long测试Float Ori:-4611686018427387904.0 BigDecimal True:-4611686018427387904.0
Assert
.
assertTrue
(
"MUL CASE5"
,
result
instanceof
Long
&&
result
.
equals
(
4294967294L
));
result
=
OperatorOfNumber
.
multiply
(
ob1
[
2
],
ob2
[
1
],
true
);
Assert
.
assertTrue
(
"MUL CASE6"
,
result
instanceof
BigDecimal
&&
result
.
equals
(
new
BigDecimal
(-
4611686018427387904.0
).
setScale
(
1
)));
//Long溢出 Ori:0 Long False:-9223372036854775808*2 BigDecimal
result
=
OperatorOfNumber
.
multiply
(
ob1
[
2
],
ob2
[
11
],
true
);
Assert
.
assertTrue
(
"MUL CASE7"
,
result
instanceof
BigDecimal
&&
result
.
equals
(
new
BigDecimal
(-
9223372036854775808L
).
multiply
(
new
BigDecimal
(
2
))));
//Long溢出 Ori:0 Integer False:-9223372036854775808*2 BigDecimal
result
=
OperatorOfNumber
.
multiply
(
ob1
[
4
],
ob2
[
13
],
true
);
Assert
.
assertTrue
(
"MUL CASE8"
,
result
instanceof
BigDecimal
&&
result
.
equals
(
new
BigDecimal
(-
9223372036854775808L
).
multiply
(
new
BigDecimal
(
2
))));
}
@Test
public
void
divide
()
throws
Exception
{
//-2147483648,2147483647,-9223372036854775808,9223372036854775807
Object
[]
ob1
=
{
Integer
.
MIN_VALUE
,
Integer
.
MAX_VALUE
,
Long
.
MIN_VALUE
,
Long
.
MAX_VALUE
,
new
BigDecimal
(
Long
.
MAX_VALUE
)};
Object
[]
ob2
=
{-
0.5f
,
0.5f
,-
0.5d
,
0.5d
,
0
,
1
,-
1
,
1.0f
,-
1.0d
,
1.3f
,-
1.3d
,
2
,-
2
,
new
BigDecimal
(
2L
),
888888
};
Object
result
=
null
;
//Integer测试Float 4294967296.0000000000 BigDecimal True:4294967296.0000000000
result
=
OperatorOfNumber
.
divide
(
ob1
[
0
],
ob2
[
0
],
true
);
Assert
.
assertTrue
(
"DIV CASE1"
,
result
instanceof
BigDecimal
&&
result
.
equals
(
new
BigDecimal
(
4294967296.0000000000
).
setScale
(
10
)));
//Integer测试Double -4294967296.0000000000 BigDecimal True:-4294967296.0000000000
result
=
OperatorOfNumber
.
divide
(
ob1
[
0
],
ob2
[
3
],
true
);
Assert
.
assertTrue
(
"DIV CASE2"
,
result
instanceof
BigDecimal
&&
result
.
equals
(
new
BigDecimal
(-
4294967296.0000000000
).
setScale
(
10
)));
//Long转Integer Ori:-18446744073709551616.0000000000 Long BigDecimal:-18446744073709551616.0000000000
result
=
OperatorOfNumber
.
divide
(
ob1
[
2
],
ob2
[
1
],
true
);
Assert
.
assertTrue
(
"DIV CASE3"
,
result
instanceof
BigDecimal
&&
result
.
equals
(
new
BigDecimal
(-
9223372036854775808L
).
divide
(
new
BigDecimal
(
0.5
)).
setScale
(
10
)));
//Long测试Float Ori:4611686018427387903.5000000000 BigDecimal True:4611686018427387903.5000000000
result
=
OperatorOfNumber
.
divide
(
ob1
[
4
],
ob2
[
13
],
true
);
Assert
.
assertTrue
(
"DIV CASE4"
,
result
instanceof
BigDecimal
&&
result
.
equals
(
new
BigDecimal
(
9223372036854775807L
).
divide
(
new
BigDecimal
(
2
)).
setScale
(
10
)));
}
@Test
public
void
modulo
()
throws
Exception
{
//-2147483648,2147483647,-9223372036854775808,9223372036854775807
Object
[]
ob1
=
{
Integer
.
MIN_VALUE
,
Integer
.
MAX_VALUE
,
Long
.
MIN_VALUE
,
Long
.
MAX_VALUE
,
new
BigDecimal
(
Long
.
MAX_VALUE
)};
Object
[]
ob2
=
{-
0.5f
,
0.5f
,-
0.5d
,
0.5d
,
0
,
1
,-
1
,
1.0f
,-
1.0d
,
1.3f
,-
1.3d
,
2
,-
2
,
new
BigDecimal
(
2L
),
888888
};
Object
result
=
null
;
//Integer -819128 Integer True:-819128
result
=
OperatorOfNumber
.
modulo
(
ob1
[
0
],
ob2
[
14
]);
Assert
.
assertTrue
(
"MOD CASE1"
,
result
instanceof
Integer
&&
result
.
equals
(-
819128
));
//Long -480488 Long True:-480488
result
=
OperatorOfNumber
.
modulo
(
ob1
[
2
],
ob2
[
14
]);
Assert
.
assertTrue
(
"MOD CASE2"
,
result
instanceof
Long
&&
result
.
equals
(-
480488L
));
}
@Test
public
void
systemCaseRunTime
()
throws
Exception
{
String
evalExpress
=
"a*2"
;
final
ExpressRunner
runner
=
new
ExpressRunner
(
true
,
false
);
DefaultContext
<
String
,
Object
>
nameMap
=
new
DefaultContext
<
String
,
Object
>();
nameMap
.
put
(
"a"
,
new
BigDecimal
(
Long
.
MAX_VALUE
));
long
timeStart
=
System
.
currentTimeMillis
();
for
(
int
i
=
0
;
i
<
100000
;
i
++){
Object
obj
=
runner
.
execute
(
evalExpress
,
nameMap
,
null
,
false
,
false
);
}
System
.
out
.
println
(
System
.
currentTimeMillis
()-
timeStart
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录