Java BigDecimal クラス アプリケーションのサンプル コード分析

WBOY
リリース: 2023-04-20 18:25:08
転載
1181 人が閲覧しました

1. はじめに

float 型と double 型の主な設計目標は、科学計算と工学計算です。これらは 2 進浮動小数点演算を実行します。これは、広範囲の値に対して高精度で高速な近似計算を提供するように慎重に設計されています。ただし、完全に正確な結果が得られるわけではないため、正確な結果が必要な場合には使用しないでください。ただし、ビジネス計算では正確な結果が必要になることが多く、このような場合には BigDecimal が役に立ちます。

2. 知識ポイントの紹介

  • 1. 概要

  • 2. 構築方法

  • 3. 加算、減算、乗算、除算の演算

  • 4. ソースコードの説明

  • 5. 概要

  • 6. 洗練演習

3. 知識ポイントの詳細説明

1. 概要

なぜ使用するのかBigDecimal?

コードのデモ:

package com.Test;

import Test2.MyDate;
import java.awt.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Properties;

public class Main {
private final static String name = "磊哥的java历险记-@51博客";
public static void main(String[] args) {
System.out.println(0.2 + 0.1);
System.out.println(0.3 - 0.1);
System.out.println(0.2 * 0.1);
System.out.println(0.3 / 0.1);
System.out.println("============="+name+"=============");
}
}
ログイン後にコピー

Java BigDecimal クラス アプリケーションのサンプル コード分析

見間違いだと思われますが、結果は次のようになります。どうしたの?その理由は、私たちのコンピュータがバイナリであるためです。浮動小数点数を 2 進数で正確に表現する方法はありません。私たちの CPU は、浮動小数点数を指数と仮数の 2 つの部分で構成するものとして表現します。この表現方法では一般にある程度の精度が失われ、浮動小数点数演算によっては一定のエラーが発生します。たとえば、2.4 のバイナリ表現は正確には 2.4 ではありません。代わりに、最も近いバイナリ表現は 2.3999999999999999 です。浮動小数点数の値は、実際には特定の数式によって計算されます。

実際、Java の float は科学計算または工学計算にのみ使用できます。ほとんどの商用計算では、通常、正確な計算に java.math.BigDecimal クラスが使用されます。

2. BigDecimal 構築メソッド

  • (1) public BigDecimal(double val): double 表現を BigDecimal に変換します (注: 推奨されません)

  • (2) public BigDecimal(int val): int 表現を BigDecimal に変換します。

  • (3) public BigDecimal(String val): 文字列を変換します。 表現を BigDecimal に変換します。

最初の構築方法の使用が推奨されないのはなぜですか?

コードのデモ:

package com.Test;

import Test2.MyDate;

import java.awt.*;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Properties;

public class Main {

private final static String name = "磊哥的java历险记-@51博客";

public static void main(String[] args){
BigDecimal bigDecimal =new BigDecimal(2);
BigDecimal bDouble = new BigDecimal(2.3);
BigDecimal bString = new BigDecimal("2.3");
System.out.println("bigDecimal="+ bigDecimal);
System.out.println("bDouble="+ bDouble);
System.out.println("bString="+ bString);
System.out.println("============="+name+"=============");
}
}
ログイン後にコピー

実行結果は次のとおりです:

Java BigDecimal クラス アプリケーションのサンプル コード分析

なぜ表示されるのでしょうか?この場合はどうなりますか?

3. ソース コードの説明

パラメーター型が double のコンストラクター メソッドの結果は、いくぶん予測できません。 Java で newBigDecimal(0.1) を記述すると、0.1 (スケールが 1 であるスケールなしの値 1) に正確に等しい BigDecimal が作成されると考える人もいるかもしれませんが、実際には 0.100000000000000005551115123

1257827021181583404541015625 に等しくなります。これは、0.1 を double として (または、有限長の 2 進 10 進数として) 正確に表すことができないためです。この方法では、コンストラクターに渡される値は、正確に 0.1 に等しくなりません (ただし、その値と等しいように見えます)。

一方、String コンストラクターは完全に予測可能です。newBigDecimal("0.1") と記述すると、予想される 0.1 と正確に等しい BigDecimal が作成されます。したがって、比較すると、一般的には String コンストラクターを優先して使用することをお勧めします。

double を BigDecimal のソースとして使用する必要がある場合は、Double.toString(double) を使用して String に変換してから、String コンストラクターを使用するか、静的メソッド valueOf

# を使用してください。 ## BigDecimal コードのデモ:

package com.Test;
import Test2.MyDate;
import java.math.BigDecimal;
public class Main {
private final static String name = "磊哥的java历险记-@51博客";
public static void main(String[] args) {
BigDecimal bDouble1 =BigDecimal.valueOf(2.3);
BigDecimal bDouble2 = new BigDecimal(Double.toString(2.3));
System.out.println("bDouble1="+ bDouble1);
System.out.println("bDouble2="+ bDouble2);
System.out.println("============="+name+"=============");
}
}
ログイン後にコピー

結果は次のとおりです:

Java BigDecimal クラス アプリケーションのサンプル コード分析

4. BigDecimal の加算、減算、乗算および除算の演算

一般的に使用される加算、減算、乗算、および除算のために、BigDecimal クラスは対応するメンバー メソッドを提供します。

  • (1) public BigDecimal add(BigDecimal value); add

  • (2) public BigDecimalsubtract(BigDecimal value); //減算

  • (3) public BigDecimal multiply(BigDecimal value); //乗算 (4) public BigDecimal dive(BigDecimal value); Division

コードのデモ:

package com.Test;
import Test2.MyDate;
import java.math.BigDecimal;
public class Main {
private final static String name = "磊哥的java历险记-@51博客";
public static void main(String[] args){
BigDecimal a = new BigDecimal("4.5");
BigDecimal b = new BigDecimal("1.5");
System.out.println("a+ b =" + a.add(b));
System.out.println("a- b =" + a.subtract(b));
System.out.println("a* b =" + a.multiply(b));
System.out.println("a/ b =" + a.divide(b));
System.out.println("============="+name+"=============");
}
}
ログイン後にコピー

Java BigDecimal クラス アプリケーションのサンプル コード分析

ここで注意すべき点は、除算演算の除算です。

BigDecimal 除算は割り切れない可能性があります。 4.5/1.3 などの場合、エラー java.lang.ArithmeticException:Non-terminated 10進数展開; 正確に表現可能な 10 進数の結果がありません。

実際、divide メソッドは 3 つのパラメータを渡すことができます:

public BigDecimal divide(BigDecimal divisor, int scale, introundingMode) 第一参数表示除数, 第二个参数表示小数点后保留位数, 第三个参数表示舍入模式,只有在作除法运算或四舍五入时才用到舍入模式,有下面这几种

  • (1)ROUND_CEILING //向正无穷方向舍入

  • (2)ROUND_DOWN //向零方向舍入

  • (3)ROUND_FLOOR //向负无穷方向舍入

  • (4)ROUND_HALF_DOWN //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5

  • (5)ROUND_HALF_EVEN //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN

  • (6)ROUND_HALF_UP //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6

  • (7)ROUND_UNNECESSARY //计算结果是精确的,不需要舍入模式

  • (8)ROUND_UP //向远离0的方向舍入

按照各自的需要,可传入合适的第三个参数。四舍五入采用 ROUND_HALF_UP

需要对BigDecimal进行截断和四舍五入可用setScale方法,例:

代码演示:

public static void main(String[] args) {
BigDecimal a = newBigDecimal("4.5635");
//保留3位小数,且四舍五入
a = a.setScale(3,RoundingMode.HALF_UP);
System.out.println(a);
}
ログイン後にコピー

注:减乘除其实最终都返回的是一个新的BigDecimal对象,因为BigInteger与BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象

代码演示:

package com.Test;
import Test2.MyDate;
import java.math.BigDecimal;
public class Main {
private final static String name = "磊哥的java历险记-@51博客";
public static void main(String[] args){
BigDecimal a = new BigDecimal("4.5");
BigDecimal b = new BigDecimal("1.5");
a. add(b);
System.out.println(a); //输出4.5. 加减乘除方法会返回一个新的
System.out.println("============="+name+"=============");
}
}
ログイン後にコピー

Java BigDecimal クラス アプリケーションのサンプル コード分析

5、总结

  • (1)商业计算使用BigDecimal。

  • (2)尽量使用参数类型为String的构造函数。

  • (3)BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产wf 所以在做加减乘除运算时千万要保存操作后的值。

  • (4)我们往往容易忽略JDK底层的一些实现细节,导致出现错误,需要多加注意。

6、精炼练习

在银行结算或支付中,我们经常会用到BigDecimal的相关方法。

6.1 题目
  • (1)使用BigDecimal创建出浮点类型的数字

  • (2)使用BigDecimal进行加减乘除运算

6.2 实验步骤
  • (1)声明一个类Test

  • (2)在Test类中,完成BigDecimal的构造和方法使用

代码演示:

package com.Test;
import Test2.MyDate;
import java.math.BigDecimal;
public class Main {
private final static String name = "磊哥的java历险记-@51博客";
public static void main(String[] args){
BigDecimal number = new BigDecimal("3.14");
//加法
System.out.println(number.add(new BigDecimal("1")));
//减法
System.out.println(number.subtract(new BigDecimal("1")));
//乘法
System.out.println(number.multiply(new BigDecimal("2")));
//除法
System.out.println(number.multiply(new BigDecimal("3.14")));
System.out.println("============="+name+"=============");
}
}
ログイン後にコピー

Java BigDecimal クラス アプリケーションのサンプル コード分析

以上がJava BigDecimal クラス アプリケーションのサンプル コード分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!