浮点数精确位数


用浮点数时候,经常会遇到相加得到的结果如下:3.00000001这样的结果

如果用BigDecimal就可以解决这种问题。

代码如下:



-------浮点数,容易出现很大的数字的不精确,我们用BigDecimal来代替
 /**
     * rev 
     * @param event
     */
    public void recTotalCost(ActionEvent event){
    	this.cleanErrorMsg();
    	BigDecimal b1 = new BigDecimal(Double.toString(0.0)); //total
    	BigDecimal b2 = new BigDecimal(Double.toString(0.0)); //unitCost
    	BigDecimal b3 = new BigDecimal(Integer.toString(0)); //recQty
    	PoDetail item = null;
    	if(availablePoDetailList!=null&&!availablePoDetailList.isEmpty()){
    		for (int i = 0; i < availablePoDetailList.size(); i++) {
            	item = availablePoDetailList.get(i);
            	if(item.getActiveFlag()!=null&&item.getActiveFlag().equals("Y")){
            		b2 = new BigDecimal(Double.toString(item.getUnitCost()!=null?item.getUnitCost():0.0)); 
                	if( item.getRecQty()!=null &&  item.getRecQty()>0){
                		int recQty = item.getRecQty();
                		b3 = new BigDecimal(Integer.toString(recQty)); 
                		b1 = b1.add(b2.multiply(b3));
                	}
            	}
            	
            }
            this.poItem.setRevTotalCost(b1.doubleValue());
            msg.sendInfoMSG("");
    	}else{
    		msg.sendErrorMSG("NO data");
    	}
        
    }


### C++ 中控制浮点数精度并保留小数位数的方法 在 C++ 编程中,可以通过多种方式实现对浮点数输出的小数位数进行精确控制。以下是几种常见的方法及其特点: #### 方法一:使用 `std::format` 函数(C++20 或更高版本) 对于支持 C++20 的编译器环境,可以利用 `std::format` 来格式化浮点数的输出。这种方式语法简洁且功能强大。 ```cpp #include <iostream> #include <format> int main() { double a = 3.14159; int b = 2; std::cout << std::format("{:.2f}", a) << "\n"; // 固定两位小数 std::cout << std::format("{:.{}f}", a, b) << "\n"; // 动态指定小数位数 } ``` 此代码片段展示了如何固定或动态调整浮点数的小数位数[^1]。 --- #### 方法二:使用 `<iomanip>` 头文件中的工具函数 这是传统且广泛兼容的方式,适用于大多数标准库实现。主要涉及两个函数:`std::setprecision()` 和 `std::fixed`。 ##### 设置总有效数字数量 当未启用定点模式时,`std::setprecision(n)` 表示的是整个数的有效数字总数(包括整数部分和小数部分)。 ```cpp #include <iostream> #include <iomanip> int main() { double a = 3.14159; std::cout << std::setprecision(4) << a << "\n"; // 总共四位有效数字 } ``` 此处的输出可能为 `3.142`,因为设置了总共四个有效数字[^2]。 ##### 启用定点模式后设置小数位数 通过调用 `std::fixed` 并配合 `std::setprecision(n)`,可以直接定义小数点后的具体位数。 ```cpp #include <iostream> #include <iomanip> int main() { double a = 3.14159; std::cout << std::fixed << std::setprecision(2) << a << "\n"; // 小数点后两位 std::cout << std::scientific << std::setprecision(4) << a << "\n"; // 科学计数法下的四位有效数字 } ``` 在此情况下,`std::fixed` 确保后续的 `std::setprecision(n)` 调用仅影响小数部分[^3]。 --- #### 方法三:结合流操作符手动设定属性 除了借助 `<iomanip>` 提供的功能外,还可以直接修改流的状态标志来达到相同效果。 ```cpp #include <iostream> int main() { double a = 3.14159; std::cout.setf(std::ios::fixed, std::ios::floatfield); std::cout.precision(3); // 设定三位小数 std::cout << a << "\n"; std::cout.unsetf(std::ios::fixed); // 取消定点模式 std::cout << a << "\n"; } ``` 这里演示了如何切换定点模式以及恢复默认行为。 --- #### 示例程序综合展示 下面是一个完整的例子,涵盖了以上提到的不同技术手段: ```cpp #include <iostream> #include <iomanip> #include <format> int main() { double value = 3.14159; // 使用 format 格式化 (C++20) std::cout << std::format("{:.2f}", value) << "\n"; // 输出: 3.14 // 使用 iomanip 工具 std::cout << std::fixed << std::setprecision(2) << value << "\n"; // 输出: 3.14 // 默认有效数字模式 std::cout << std::setprecision(4) << value << "\n"; // 输出: 3.1416 return 0; } ``` 上述代码分别采用了现代 (`std::format`) 和经典 (`<iomanip>`) 方式完成相同的任务[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值