如何正确使用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-seoK-seo
Previous 2024-12-05 08:39
Next 2024-12-05 08:40

相关推荐

  • redis实现多级缓存 java

    Redis可以通过使用Java的Jedis库实现多级缓存。将数据存储在Redis中,然后根据需要将其缓存到本地内存或磁盘中。

    2024-05-20
    0104
  • 国外编程语言_其他编程语言

    国外编程语言指的是在外国开发或者流行的编程语言,如Python、Java和C++等。其他编程语言则是指除了这些主流语言之外的各种编程工具,例如Rust、Go和Swift等新兴语言。

    2024-07-08
    082
  • 如何使用Java在MySQL中执行DESC命令来查询数据库表结构?

    要使用Java查询MySQL数据库表结构,可以使用以下代码:,,``java,import java.sql.Connection;,import java.sql.DatabaseMetaData;,import java.sql.DriverManager;,import java.sql.ResultSet;,import java.sql.SQLException;,,public class Main {, public static void main(String[] args) {, String url = "jdbc:mysql://localhost:3306/your_database_name";, String user = "your_username";, String password = "your_password";,, try {, Connection connection = DriverManager.getConnection(url, user, password);, DatabaseMetaData metaData = connection.getMetaData();, ResultSet columns = metaData.getColumns(null, null, "your_table_name", null);,, while (columns.next()) {, System.out.println(columns.getString("COLUMN_NAME") + " " + columns.getString("TYPE_NAME"));, },, connection.close();, } catch (SQLException e) {, e.printStackTrace();, }, },},`,,请将your_database_name、your_username、your_password和your_table_name`替换为实际的数据库名、用户名、密码和表名。

    2024-08-11
    094
  • java mongodb增删改查

    Java操作MongoDB进行增删改查,可以使用MongoTemplate或MongoRepository。以下是一个简单的示例:,,``java,import org.springframework.beans.factory.annotation.Autowired;,import org.springframework.data.mongodb.core.MongoTemplate;,import org.springframework.stereotype.Component;,,@Component,public class MongoDBService {,, @Autowired, private MongoTemplate mongoTemplate;,, // 增加数据, public void insertData(String collectionName, Object data) {, mongoTemplate.insert(collectionName, data);, },, // 删除数据, public void deleteData(String collectionName, Object id) {, Query query = new Query(Criteria.where("_id").is(id));, mongoTemplate.remove(query, collectionName);, },, // 更新数据, public void updateData(String collectionName, Object filter, Object update) {, Update updateOperation = new Update();, updateOperation.setFilter(filter);, updateOperation.setUpdate(update);, mongoTemplate.updateFirst(updateOperation, collectionName);, },, // 查询数据, public List findData(String collectionName, Object filter) {, return mongoTemplate.find(filter, collectionName);, },},``

    2024-05-21
    0129
  • 探索服务器端技术的奥秘,它如何支撑现代互联网应用?

    服务器端技术是用于开发和管理服务器应用的技术和工具,这些技术可以用于构建和管理各种类型的服务器,如Web服务器、数据库服务器、应用服务器等,以下是对服务器端技术的详细介绍:一、编程语言1、Java:一种广泛使用的面向对象编程语言,具有强大的功能和广泛的支持,提供了丰富的开发工具和库,2、C:由微软开发,主要用于……

    行业资讯 2024-12-25
    05
  • 如何利用Java构建高效的移动应用框架?

    在当今的软件开发领域,移动应用的开发已经成为了一个重要的趋势,Java作为一种广泛使用的编程语言,其在移动应用开发中也扮演着重要的角色,本文将探讨Java在移动应用开发中的应用,特别是针对Android平台的应用开发框架,一、Java在移动应用开发中的重要性Java语言因其跨平台性、稳定性和丰富的库支持,在移动……

    网站运维 2024-11-25
    04

发表回复

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

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