- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Java中BigDecimal的加减乘除、比较大小与使用注意事项由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言 。
借用《effactive java》这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。但是,商业计算往往要求结果精确,在java 里面,int 的最大值是:2147483647,现在如果想用比这个数大怎么办?换句话说,就是数值较大,这时候就用到了bigdecimal ,关于bigdecimal 的介绍有很多,需要了解的朋友可以参考这篇文章:http://www.zzvips.com/article/34898.html 。
1、bigdecimal 的加减乘除 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
bigdecimal bignum1 =
new
bigdecimal(
"10"
);
bigdecimal bignum2 =
new
bigdecimal(
"5"
);
bigdecimal bignum3 =
null
;
//加法
bignum3 = bignum1.add(bignum2);
system.out.println(
"和 是:"
+ bignum3);
//减法
bignum3 = bignum1.subtract(bignum2);
system.out.println(
"差 是:"
+ bignum3);
//乘法
bignum3 = bignum1.multiply(bignum2);
system.out.println(
"积 是:"
+ bignum3);
//除法
bignum3 = bignum1.divide(bignum2);
system.out.println(
"商 是:"
+ bignum3);
|
运行结果为:
2、bigdecimal 的比较大小.
1
2
3
4
5
6
7
8
9
|
bigdecimal num1 =
new
bigdecimal(
"0"
);
bigdecimal num2 =
new
bigdecimal(
"1"
);
bigdecimal num3 =
new
bigdecimal(
"2"
);
bigdecimal num =
new
bigdecimal(
"1"
);
//用做比较的值
system.out.println(num1.compareto(num));
//小于 时,返回 -1
system.out.println(num2.compareto(num));
//等于 时,返回 0
system.out.println(num3.compareto(num));
//大于 时,返回 1
|
这是输出结果:
解释下注释里面了.
补充:
biginteger 也可以存放比较大的数, 和 bigdecimal 的区别是 :biginteger 存放的是大的整数,而bigdecimal 存放大的小数 。
继续补充一下,用bigdecimal 写个for循环.
1
2
3
|
for
(bigdecimal i =
new
bigdecimal(
"0"
); i.compareto(
new
bigdecimal(
"10"
)) !=
1
; i = i.add(
new
bigdecimal(
"1"
))) {
system.out.print(i +
"\t"
);
}
|
控制台打印的是从0 到 10 .
3、java中的bigdecimal使用注意事项 。
1.bigdecial是immutable的,就像string一样,它的所有操作都会生成一个新的对象,所以 。
1
|
amount.add( thisamount );
|
是错误的;而应该是:
1
|
amount = amount.add( thisamount );
|
2. 不要用equals方法来比较bigdecimal对象,因为它的equals方法会比较scale,如果scale不一样,它会返回false; 。
例如:
1
2
3
|
bigdecimal a =
new
bigdecimal(
"2.00"
);
bigdecimal b =
new
bigdecimal(
"2.0"
);
print(a.equals(b));
// false
|
所以你应该使用compareto()和signum()方法 。
1
2
|
a.compareto(b);
// returns (-1 if a < b), (0 if a == b), (1 if a > b)
a.signum();
// returns (-1 if a < 0), (0 if a == 0), (1 if a > 0)
|
3. 使用bigdecimal的字符串构造函数,不要使用double参数的构造函数,否则的话会出现你不想要的结果.
例如下面的代码分别使用double和string的构造函数,然后使用half_even的round方法,但是输出结果不一样:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
system.out.println(
"=================="
);
for
(
int
i =
0
; i <
10
; i ++) {
stringbuffer sb =
new
stringbuffer();
sb.append(
"0."
);
sb.append(i);
sb.append(
"5"
);
bigdecimal bdx =
new
bigdecimal(sb.tostring());
system.out.println(sb +
" "
+bdx.setscale(
1
, roundingmode.half_even));
}
system.out.println(
"=================="
);
for
(
int
i =
0
; i <
10
; i ++) {
stringbuffer sb =
new
stringbuffer();
sb.append(
"0."
);
sb.append(i);
sb.append(
"5"
);
bigdecimal bdx =
new
bigdecimal(
double
.valueof(sb.tostring()));
system.out.println(sb +
" "
+bdx.setscale(
1
, roundingmode.half_even));
}
|
输出是:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
==================
0.05
0.0
0.15
0.2
0.25
0.2
0.35
0.4
0.45
0.4
0.55
0.6
0.65
0.6
0.75
0.8
0.85
0.8
0.95
1.0
==================
0.05
0.1
0.15
0.1
0.25
0.2
0.35
0.3
0.45
0.5
0.55
0.6
0.65
0.7
0.75
0.8
0.85
0.8
0.95
0.9
|
总结 。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我的支持.
原文链接:http://blog.csdn.net/limingchuan123456789/article/details/12524495 。
最后此篇关于Java中BigDecimal的加减乘除、比较大小与使用注意事项的文章就讲到这里了,如果你想了解更多关于Java中BigDecimal的加减乘除、比较大小与使用注意事项的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
当你做这样的事情 BigDecimal bigDecimal = BigDecimal.ONE; 为什么bigDecimal成为一个新对象? 最佳答案 在这种情况下,变量(或字段)bigDecimal
我正在使用 BigDecimal 计算一些大实数。虽然我尝试了两种方法:BigDecimal.toString() 或 BigDecimal.stripTrailingZeros().toString
我广泛使用 BigDecimals。我经常需要进行长时间的计算,然后比较结果。由于这些漫长的计算,答案不是 1而是0.9999999... 。这就是为什么我无法精确比较 BigDecimals,而只能
我有一段代码有两个 BigDecimal 变量。这两个变量都被发送到方法格式(工作正常)然后打印。变量“d”被发送到格式方法,然后直接打印而不分配它(因为格式方法返回一个字符串)。问题出现在变量 a
我遇到过 java.math.BigDecimal 和 android.icu.math.BigDecimal 因为我需要在项目中使用 BigDecimal . 我意识到 Android BigDec
我在整个应用程序中使用 BigDecimal 来处理金钱 和百分比。但是,我需要一种方法来区分两者之间的用法(为了呈现它们,即在 JTable 中)。因此,我最初的想法是编写两个行为与 BigDeci
这应该很简单,但它正在爆炸。有什么想法吗? d = BigDecimal.new("2.0") YAML::load({:a => d}.to_yaml) TypeError: BigDecimal
我有两个 BigDecimal,我想根据它们的 significant digits 确定它们是否接近。 . 例如,请考虑以下内容: BigDecimal million = new BigDecim
我需要一种方法将其表达为有效的java代码:我有2个BigDecimals,我想知道较小的BigDecimal是否可以(当添加到较大的BigDecimals时) BigDecimal 一次)更改较大
我正在争论是使用 BigDecimal 和 BigInteger 还是仅使用 BigDecimal 来让我的生活更轻松,减少来回转换。在资源方面仅使用 BigDecimal 有缺点吗? 仅使用原始数据
我有以下代码: Welcome to Scala version 2.10.3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_45). scala> v
我有一个 java 客户端,它通过 GRPC 调用 Clojure 服务。问题是,当我们从他们的服务收到响应时,它会在大十进制的末尾添加字母。当我们尝试在 java 中将其转换为大十进制时,我们会收到
我仍在学习 Java,并且一直在阅读多个站点上的文章。我在 Java Code Geeks 找到了一篇文章我有一个问题。该文章正在解释开放/封闭原则。本文以对公司产品应用折扣的场景为例。第一部分代码如
我正在尝试对 List 中的多个 BigDecimals 求和.目前,我正在使用两个流,但如果可能的话,我希望只有一个流。我不确定如何以高效的方式重写下面的内容。 BigDecimal totalCh
下面两行代码有什么区别? BigDecimal one = new BigDecimal("1"); BigDecimal two = BigDecimal.ONE; 两条线是否相同? 谢谢! 最佳答
这个问题在这里已经有了答案: BigDecimal from Double incorrect value? (4 个答案) Convert double to BigDecimal and set
在 Java 中,来自另一个 bigDecimal.toString() 的新 BigDecimal 是否总是等于?例如 BigDecimal a = new BigDecimal("1.23
对于新变量的比较或初始化,您使用其中的哪一个会有所不同吗? 我知道 BigDecimal.ZERO 是 1.5 的功能,所以这是一个问题,但假设我使用的是 1.5,这有关系吗? 谢谢。 最佳答案 Bi
情况: public static double pi(int a) { return (BigDecimal.valueOf(53360*sqrt(640320))).divide(co
我正在尝试创建一个可以在 diesel 中用于插入的结构。具体来说,我正在使结构可插入。编译时出现此错误。 我有一个结构,我正试图通过 derive 属性使 Insertable 成为可能。我有一个名
我是一名优秀的程序员,十分优秀!