如何正确使用BigDecimal进行累加操作?

BigDecimal累加

bigdecimal累加

背景与

Java编程中,BigDecimal类提供了对超过16位有效数字的十进制数进行精确算术运算的能力,它适用于金融计算、科学计算等场景,在这些场景中,使用浮点数(如floatdouble)可能会因为精度丢失而导致错误的结果,通过使用BigDecimal类,可以避免由于二进制浮点数的有限精度带来的舍入误差问题。

基本概念及构造方法

`BigDecimal` 类的

高精度:支持任意精度的十进制数。

不可变性:所有操作都不会改变原始对象,而是返回一个新的BigDecimal 对象。

灵活的舍入模式:提供多种舍入模式,如四舍五入、向上舍入等。

构造方法与静态工厂方法

new BigDecimal(String val):根据字符串创建一个BigDecimal 实例。

bigdecimal累加

BigDecimal.valueOf(long val):根据长整型值创建一个BigDecimal 实例。

BigDecimal.valueOf(double val):根据双精度浮点数创建一个BigDecimal 实例。

数学运算

加法

BigDecimal 提供了add 方法来进行加法操作,以下是一个示例代码:

import java.math.BigDecimal;
public class BigDecimalExample {
    public static void main(String[] args) {
        BigDecimal num1 = new BigDecimal("10.5");
        BigDecimal num2 = new BigDecimal("20.75");
        BigDecimal sum = num1.add(num2);
        System.out.println("Sum: " + sum);  // 输出 31.25
    }
}

在这个例子中,我们创建了两个BigDecimal 对象num1num2,并使用add 方法将它们相加,结果存储在sum 中并输出。

减法

类似地,可以使用subtract 方法进行减法操作:

import java.math.BigDecimal;
public class BigDecimalExample {
    public static void main(String[] args) {
        BigDecimal num1 = new BigDecimal("20.75");
        BigDecimal num2 = new BigDecimal("10.5");
        BigDecimal difference = num1.subtract(num2);
        System.out.println("Difference: " + difference);  // 输出 10.25
    }
}

乘法

乘法操作可以使用multiply 方法:

bigdecimal累加

import java.math.BigDecimal;
public class BigDecimalExample {
    public static void main(String[] args) {
        BigDecimal num1 = new BigDecimal("10.5");
        BigDecimal num2 = new BigDecimal("2.5");
        BigDecimal product = num1.multiply(num2);
        System.out.println("Product: " + product);  // 输出 26.25
    }
}

除法

除法操作可以使用divide 方法:

import java.math.BigDecimal;
import java.math.RoundingMode;
public class BigDecimalExample {
    public static void main(String[] args) {
        BigDecimal num1 = new BigDecimal("20.75");
        BigDecimal num2 = new BigDecimal("2");
        BigDecimal quotient = num1.divide(num2, 2, RoundingMode.HALF_UP);
        System.out.println("Quotient: " + quotient);  // 输出 10.38
    }
}

在这个例子中,我们使用了divide 方法,并且指定了结果的精度和小数点后的位数,以及舍入模式。

精度设置与舍入模式

在进行数学运算时,可以通过setScale 方法来指定结果的精度和舍入模式,常用的舍入模式包括:

RoundingMode.UP:远离零方向舍入。

RoundingMode.DOWN:向零方向舍入。

RoundingMode.HALF_UP:向最近邻近的数字舍入,如果正好位于中间,则向上舍入。

RoundingMode.HALF_DOWN:向最近邻近的数字舍入,如果正好位于中间,则向下舍入。

将一个数四舍五入到小数点后两位:

import java.math.BigDecimal;
import java.math.RoundingMode;
public class BigDecimalExample {
    public static void main(String[] args) {
        BigDecimal num = new BigDecimal("10.567");
        BigDecimal roundedNum = num.setScale(2, RoundingMode.HALF_UP);
        System.out.println("Rounded Number: " + roundedNum);  // 输出 10.57
    }
}

应用场景与示例代码

预算资本支付成本计算

假设有一个财务系统需要计算预算资本支付成本,可以按照以下步骤进行:

1、获取所有预算资本支付成本 (allbudgetCapitalPayCost)。

2、乘以自有比率 (shareOwnRate)。

3、调用getData 方法来处理结果。

import java.math.BigDecimal;
import java.math.RoundingMode;
public class FinancialCalculations {
    public static void main(String[] args) {
        BigDecimal allbudgetCapitalPayCost = new BigDecimal("50000");
        BigDecimal shareOwnRate = new BigDecimal("0.75");
        
        BigDecimal budgetCapitalPayCost = allbudgetCapitalPayCost.multiply(shareOwnRate);
        budgetCapitalPayCost = getData(CommonConstant.STR_ZERO, budgetCapitalPayCost);  // 根据需要调整舍入模式
        
        System.out.println("Budget Capital Pay Cost: " + budgetCapitalPayCost);
    }
    
    public static String getData(String constructionFraction, String value) {
        value = value.toString();
        if (value.indexOf(".") != -1) {
            if (constructionFraction.equals(CommonConstant.STR_ONE)) {
                value = String.valueOf(new BigDecimal(value).setScale(0, RoundingMode.FLOOR));
            } else if (constructionFraction.equals(CommonConstant.STR_ZERO)) {
                value = String.valueOf(new BigDecimal(value).setScale(0, RoundingMode.CEILING));
            } else {
                value = String.valueOf(new BigDecimal(value).setScale(0, RoundingMode.HALF_UP));
            }
        }
        return value;
    }
}

预算维修成本计算

类似地,可以计算预算维修成本:

import java.math.BigDecimal;
import java.math.RoundingMode;
public class FinancialCalculations {
    public static void main(String[] args) {
        BigDecimal allbudgetRepairCost = new BigDecimal("30000");
        BigDecimal shareOwnRate = new BigDecimal("0.75");
        
        BigDecimal budgetRepairCost = allbudgetRepairCost.multiply(shareOwnRate);
        budgetRepairCost = getData(CommonConstant.STR_ZERO, budgetRepairCost);  // 根据需要调整舍入模式
        
        System.out.println("Budget Repair Cost: " + budgetRepairCost);
    }
    
    public static String getData(String constructionFraction, String value) {
        value = value.toString();
        if (value.indexOf(".") != -1) {
            if (constructionFraction.equals(CommonConstant.STR_ONE)) {
                value = String.valueOf(new BigDecimal(value).setScale(0, RoundingMode.FLOOR));
            } else if (constructionFraction.equals(CommonConstant.STR_ZERO)) {
                value = String.valueOf(new BigDecimal(value).setScale(0, RoundingMode.CEILING));
            } else {
                value = String.valueOf(new BigDecimal(value).setScale(0, RoundingMode.HALF_UP));
            }
        }
        return value;
    }
}

总预算成本计算

将上述两个成本相加得到总预算成本:

import java.math.BigDecimal;
import java.math.RoundingMode;
public class FinancialCalculations {
    public static void main(String[] args) {
        BigDecimal allbudgetCapitalPayCost = new BigDecimal("50000");
        BigDecimal allbudgetRepairCost = new BigDecimal("30000");
        BigDecimal shareOwnRate = new BigDecimal("0.75");
        
        BigDecimal budgetCapitalPayCost = allbudgetCapitalPayCost.multiply(shareOwnRate);
        budgetCapitalPayCost = getData(CommonConstant.STR_ZERO, budgetCapitalPayCost);  // 根据需要调整舍入模式
        
        BigDecimal budgetRepairCost = allbudgetRepairCost.multiply(shareOwnRate);
        budgetRepairCost = getData(CommonConstant.STR_ZERO, budgetRepairCost);  // 根据需要调整舍入模式
        
        BigDecimal totalBudgetCost = budgetCapitalPayCost.add(budgetRepairCost);
        totalBudgetCost = getData(CommonConstant.STR_ZERO, totalBudgetCost);  // 根据需要调整舍入模式
        
        System.out.println("Total Budget Cost: " + totalBudgetCost);
    }
    
    public static String getData(String constructionFraction, String value) {
        value = value.toString();
        if (value.indexOf(".") != -1) {
            if (constructionFraction.equals(CommonConstant.STR_ONE)) {
                value = String.valueOf(new BigDecimal(value).setScale(0, RoundingMode.FLOOR));
            } else if (constructionFraction.equals(CommonConstant.STR_ZERO)) {
                value = String.valueOf(new BigDecimal(value).setScale(0, RoundingMode.CEILING));
            } else {
                value = String.valueOf(new BigDecimal(value).setScale(0, RoundingMode.HALF_UP));
            }
        }
        return value;
    }
}

项目管理费用资本支付成本计算

先计算budgetCapitalPayCost 与项目管理费比率 (cmfeerateCapitalPayCost) 的乘积,然后除以100,最后调用getData 方法:

import java.math.BigDecimal;
import java.math.RoundingMode;
public class FinancialCalculations {
    public static void main(String[] args) {
        BigDecimal budgetCapitalPayCost = new BigDecimal("10000");
        BigDecimal cmfeerateCapitalPayCost = new BigDecimal("0.05");  // 项目管理费率为5%
        
        BigDecimal cmfeeCapitalPayCost = budgetCapitalPayCost.multiply(cmfeerateCapitalPayCost).divide(new BigDecimal("100"));
        cmfeeCapitalPayCost = getData(CommonConstant.STR_ZERO, cmfeeCapitalPayCost);  // 根据需要调整舍入模式
        
        System.out.println("CM Fee Capital Pay Cost: " + cmfeeCapitalPayCost);
    }
    
    public static String getData(String constructionFraction, String value) {
        value = value.toString();
        if (value.indexOf(".") != -1) {
            if (constructionFraction.equals(CommonConstant.STR_ONE)) {
                value = String.valueOf(new BigDecimal(value).setScale(0, RoundingMode.FLOOR));
            } else if (constructionFraction.equals(CommonConstant.STR_ZERO)) {
                value = String.valueOf(new BigDecimal(value).setScale(0, RoundingMode.CEILING));
            } else {
                value = String.valueOf(new BigDecimal(value).setScale(0, RoundingMode.HALF_UP));
            }
        }
        return value;
    }
}

项目管理费用维修成本计算

计算方式同上:

import java.math.BigDecimal;
import java.math.RoundingMode;
public class FinancialCalculations {
    public static void main(String[] args) {
        BigDecimal budgetRepairCost = new BigDecimal("20000");
        BigDecimal cmfeerateCapitalPayCost = new BigDecimal("0.05");  // 项目管理费率为5%
        
        BigDecimal cmfeeRepairCost = budgetRepairCost.multiply(cmfeerateCapitalPayCost).divide(new BigDecimal("100"));
        cmfeeRepairCost = getData(CommonConstant.STR_ZERO, cmfeeRepairCost);  // 根据需要调整舍入模式
        
        System.out.println("CM Fee Repair Cost: " + cmfeeRepairCost);
    }
    
    public static String getData(String constructionFraction, String value) {
        value = value.toString();
        if (value.indexOf(".") != -1) {
            if (constructionFraction.equals(CommonConstant.STR_ONE)) {
                value = String.valueOf(new BigDecimal(value).setScale(0, RoundingMode.FLOOR));
            } else if (constructionFraction.equals(CommonConstant.STR_ZERO)) {
                value = String.valueOf(new BigDecimal(value).setScale(0, RoundingMode.CEILING));
            } else {
                value = String.valueOf(new BigDecimal(value).setScale(0, RoundingMode.HALF_UP));
            }
        }
        return value;
    }
}

总项目管理费用计算

将上述两个项目管理费用相加得到总项目管理费用:

import java.math.BigDecimal;
import java.math.RoundingMode;
public class FinancialCalculations {
    public static void main(String[] args) {
        BigDecimal budgetCapitalPayCost = new BigDecimal("10000");
        BigDecimal budgetRepairCost = new BigDecimal("20000");
        BigDecimal cmfeerateCapitalPayCost = new BigDecimal("0.05");  // 项目管理费率为5%
        
        BigDecimal cmfeeCapitalPayCost = budgetCapitalPayCost.multiply(cmfeerateCapitalPayCost).divide(new BigDecimal("100"));
        cmfeeCapitalPayCost = getData(CommonConstant.STR_ZERO, cmfeeCapitalPayCost);  // 根据需要调整舍入模式
        
        BigDecimal cmfeeRepairCost = budgetRepairCost.multiply(cmfeerateCapitalPayCost).divide(new BigDecimal("100"));
        cmfeeRepairCost = getData(CommonConstant.STR_ZERO, cmfeeRepairCost);  // 根据需要调整舍入模式
        
        BigDecimal totalCMFeeCost = cmfeeCapitalPayCost.add(cmfeeRepairCost);
        totalCMFeeCost = getData(CommonConstant.STR_ZERO, totalCMFeeCost);  // 根据需要调整舍入模式
        
        System.out.println("Total CM Fee Cost: " + totalCMFeeCost);
    }
    
    public static String getData(String constructionFraction, String value) {
        value = value.toString();
        if (value.indexOf(".") != -1) {
            if (constructionFraction.equals(CommonConstant.STR_ONE)) {
                value = String.valueOf(new BigDecimal(value).setScale(0, RoundingMode.FLOOR));
            } else if (constructionFraction.equals(CommonConstant.STR_ZERO)) {
                value = String.valueOf(new BigDecimal(value).setScale(0, RoundingMode.CEILING));
            } else {
                value = String.valueOf(new BigDecimal(value).setScale(0, RoundingMode.HALF_UP));
            }
        }
        return value;
    }
}

循环累加示例代码分析与实现详解:Java中的BigDecimal循环累加指南与最佳实践,以下是针对用户给定的代码片段进行的详细解释和分析,示例代码如下:```javaimport java.math.*;public class BigDecimalLoopAdditionExample { public static void main(String[] args) { BigInteger sum = ...

以上内容就是解答有关“bigdecimal累加”的详细内容了,我相信这篇文章可以为您解决一些疑惑,有任何问题欢迎留言反馈,谢谢阅读。

原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/705772.html

Like (0)
Donate 微信扫一扫 微信扫一扫
K-seo的头像K-seoSEO优化员
Previous 2024-12-05 08:39
Next 2024-12-05 08:40

相关推荐

  • 高薪编程语言_其他编程语言

    高薪编程语言包括Python、Java、C++等,其他编程语言如JavaScript、Ruby、Swift等也有很好的市场需求和薪资水平。

    2024-06-27
    092
  • 如何进行App开发中的图形界面编程?

    app开发图形界面编程一、理解Java语言基础在开始Java图形化APP开发之前,需要掌握Java语言的基本语法和面向对象的编程理念,Java是一种面向对象的编程语言,其基本语法和C、C++相似,但设计更加简洁,去掉了许多容易引发错误的语法,例如指针和多重继承,在Java中,一切都是对象,这使得编程思维更加清晰……

    2024-11-24
    04
  • App服务器开发,应该选择哪种编程语言?

    在开发app服务器端时,可以选择多种编程语言,以下是几种常见语言的详细介绍:1、Java跨平台性:Java具有强大的跨平台特性,能够在不同操作系统上运行而无需修改代码,成熟生态系统:Java拥有丰富的库和框架,如Spring、Hibernate等,适合构建复杂的企业级应用,高性能和稳定性:Java的性能和安全性……

    2024-12-05
    04
  • Bootstrap与Java结合实现分页功能,第一篇实例解析了什么内容?

    一、引言在现代Web开发中,分页是一种常见的需求,用于处理大量数据展示问题,提升用户体验,本文将结合Bootstrap前端框架与Java后端技术,详细介绍如何实现一个简单而实用的分页功能,通过本教程,您将学会构建一个响应式的分页界面,以及如何在Java后端进行数据处理和分页逻辑的实现,二、环境准备前端: 引入B……

    行业资讯 2024-12-08
    03
  • 如何入门App后端开发?——一份详尽教程指南

    APP后端开发教程一、APP后端开发概述1 什么是APP后端开发?APP后端开发指的是为移动应用提供数据和计算服务的技术,它主要负责数据的存储、处理和管理,以及与前端的数据交互,在移动APP中,后端开发涉及数据交互、安全验证、推送服务、存储服务和数据分析等功能的开发,2 为什么需要后端开发?后端开发是移动应用的……

    2024-12-07
    04
  • App究竟是用什么技术或语言开发的?

    App开发主要涉及多种编程语言和技术框架,具体取决于目标平台和应用场景,以下是对App开发所用技术的详细解析:iOS平台的App开发1、Swift:苹果公司于2014年发布的新编程语言,旨在取代Objective-C,Swift语法简洁易懂,接近自然语言,使得开发者能够更快地编写代码,Swift不仅兼容iOS……

    2024-11-25
    05

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

免备案 高防CDN 无视CC/DDOS攻击 限时秒杀,10元即可体验  (专业解决各类攻击)>>点击进入