Double和BigDecimal 加减乘除工具类Arith

RM机器人麦轮底盘实战:从零搭建到PID调参全记录(附避坑指南) 本文详细记录了RM机器人麦轮底盘从零搭建到PID调参的全过程,涵盖硬件组装、开发环境搭建、底盘解算和PID调参等关键步骤,并附有实用的避坑指南。特别针对麦轮控制、底盘解算和电机调试等核心问题提供了专业解决方案,帮助开发者快速提升机器人性能。 阅读详情
package com.util;
import java.math.BigDecimal;

public class Arith {
    private static final int DEF_DIV_SCALE = 10;

    /**
     * * 两个Double数相加 *
     *
     * @param v1 *
     * @param v2 *
     * @return Double
     */
    public static Double add(Double v1, Double v2) {
        if(v1==null){
            v1=0.00;
        }
        if(v2==null){
            v2=0.00;
        }
        BigDecimal b1 = new BigDecimal(v1.toString());
        BigDecimal b2 = new BigDecimal(v2.toString());
        return new Double(b1.add(b2).doubleValue());
    }

    public static BigDecimal add(BigDecimal v1, BigDecimal v2) {
        if(v1==null){
            v1=new BigDecimal(0.00);
        }
        if(v2==null){
            v2=new BigDecimal(0.00);
        }
        return v1.add(v2);
    }
    
    public static Double add(Double[] vs) {
       if(vs == null){
          return 0.00;
       }
       BigDecimal b = new BigDecimal(0.00);
       for(Double v : vs){
          BigDecimal b1 = new BigDecimal(v);
          
          b = b.add(b1);
       }
        return new Double(b.doubleValue());
    }



    /**
     * * 两个Double数相减 *
     *
     * @param v1 *
     * @param v2 *
     * @return Double
     */
    public static Double sub(Double v1, Double v2) {
        if(v1==null){
            v1=0.00;
        }
        if(v2==null){
            v2=0.00;
        }
        BigDecimal b1 = new BigDecimal(v1.toString());
        BigDecimal b2 = new BigDecimal(v2.toString());
        return new Double(b1.subtract(b2).doubleValue());
    }

    public static BigDecimal sub(BigDecimal v1, BigDecimal v2) {
        if(v1==null){
            v1=new BigDecimal(0.00);
        }
        if(v2==null){
            v2=new BigDecimal(0.00);
        }
        return v1.subtract(v2);
    }

    /**
     * * 两个Double数相乘 *
     *
     * @param v1 *
     * @param v2 *
     * @return Double
     */
    public static Double mul(Double v1, Double v2) {
        if(v1==null){
            v1=0.00;
        }
        if(v2==null){
            v2=0.00;
        }
        BigDecimal b1 = new BigDecimal(v1.toString());
        BigDecimal b2 = new BigDecimal(v2.toString());
        return new Double(b1.multiply(b2).doubleValue());
    }

    public static BigDecimal mul(BigDecimal v1, BigDecimal v2) {
        if(v1==null){
            v1=new BigDecimal(0.00);
        }
        if(v2==null){
            v2=new BigDecimal(0.00);
        }
        return v1.multiply(v2);
    }

    public static Double mul(Double v1, Double v2,int scale) {
        if(v1==null){
            v1=0.00;
        }
        if(v2==null){
            v2=0.00;
        }
        if(scale<0){
            scale=2;
        }
        BigDecimal b1 = new BigDecimal(v1.toString());
        BigDecimal b2 = new BigDecimal(v2.toString());
        return new Double(b1.multiply(b2).setScale(scale,BigDecimal.ROUND_DOWN).doubleValue());
    }

    public static BigDecimal mul(BigDecimal v1, BigDecimal v2,int scale) {
        if(v1==null){
            v1=new BigDecimal(0.00);
        }
        if(v2==null){
            v2=new BigDecimal(0.00);
        }
        if(scale<0){
            scale=2;
        }
        return v1.multiply(v2).setScale(scale,BigDecimal.ROUND_DOWN);
    }

    /**
     * * 两个Double数相除 *
     *
     * @param v1 *
     * @param v2 *
     * @return Double
     */
    public static Double div(Double v1, Double v2) {
        if(v1==null){
            v1=0.00;
        }
        if(v2==null){
            v2=0.00;
        }
        BigDecimal b1 = new BigDecimal(v1.toString());
        BigDecimal b2 = new BigDecimal(v2.toString());
        return new Double(b1.divide(b2, DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP)
                .doubleValue());
    }
    public static BigDecimal div(BigDecimal v1, BigDecimal v2) {
        if(v1==null){
            v1=new BigDecimal(0.00);
        }
        if(v2==null){
            v2=new BigDecimal(0.00);
        }
        return v1.divide(v2, DEF_DIV_SCALE, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * * 两个Double数相除,并保留scale位小数 *
     *
     * @param v1 *
     * @param v2 *
     * @param scale *
     * @return Double
     */
    public static Double div(Double v1, Double v2, int scale) {
        if(v1==null){
            v1=0.00;
        }
        if(v2==null){
            v2=0.00;
        }
        if (scale < 0) {
            scale=2;
        }
        BigDecimal b1 = new BigDecimal(v1.toString());
        BigDecimal b2 = new BigDecimal(v2.toString());
        return new Double(b1.divide(b2, scale, BigDecimal.ROUND_DOWN).doubleValue());
    }

    public static BigDecimal div(BigDecimal v1, BigDecimal v2, int scale) {
        if(v1==null){
            v1=new BigDecimal(0.00);
        }
        if(v2==null){
            v2=new BigDecimal(0.00);
        }
        if (scale < 0) {
            scale=2;
        }
        return v1.divide(v2, scale, BigDecimal.ROUND_DOWN);
    }

    public static BigDecimal setScale(BigDecimal v1,int scale) {
        if(v1==null){
            v1=new BigDecimal(0.00);
        }
        if (scale < 0) {
            scale=2;
        }
        return v1.setScale(scale,BigDecimal.ROUND_DOWN);
    }
    public static Double setScale(Double v1,int scale) {
        if(v1==null){
            v1=0.00;
        }
        if (scale < 0) {
            scale=2;
        }
        BigDecimal b1 = new BigDecimal(v1.toString());
        return new Double(b1.setScale(scale,BigDecimal.ROUND_DOWN).doubleValue());
    }

    /**
     * 比较大小
     *
     * @param v1
     * @param v2
     * @return -1表示小于,0是等于,1是大于
     */
    public static int compareTo(BigDecimal v1, BigDecimal v2) {
        if (v1 == null) {
            v1 = new BigDecimal(0.00);
        }
        if (v2 == null) {
            v2 = new BigDecimal(0.00);
        }
        return v1.compareTo(v2);
    }

    public static int compareTo(Double v1, Double v2) {
        if (v1 == null) {
            v1 = 0.00;
        }
        if (v2 == null) {
            v2 = 0.00;
        }
        BigDecimal b1 = new BigDecimal(v1.toString());
        BigDecimal b2 = new BigDecimal(v2.toString());
        return b1.compareTo(b2);
    }

    public static void main(String[] args){
        System.out.println(compareTo(new Double("0.001"),new Double("0.0010")));
    }

    /**
     * BigDecimal.setScale()方法用于格式化小数点
     * setScale(1)表示保留一位小数,默认用四舍五入方式
     * setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3
     * setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4
     * setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4
     *
     * setScaler(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35变成2.3,如果是5则向下舍
     *
     * setScaler(1,BigDecimal.ROUND_CEILING)接近正无穷大的舍入
     *
     * setScaler(1,BigDecimal.ROUND_FLOOR)接近负无穷大的舍入,数字>0和ROUND_UP作用一样,数字<0和ROUND_DOWN作用一样
     *
     * setScaler(1,BigDecimal.ROUND_HALF_EVEN)向最接近的数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
     */


}  
模型训练篇 | 手把手教你使用ResNet训练自己数据集和推理,ResNet50通用物体分类识别,含完整代码和数据集,全网最详细教程 手把手教你使用ResNet训练自己数据集和推理,ResNet50通用物体分类识别,含完整代码和数据集,全网最详细教程。本篇文章将带你学习 ResNet50 模型构建、ResNet50训练自己数据集、数据集处理、推理和验证、模型剪枝与模型改进等。 本篇教程适配各种分类识别任务,可以说是一个通用的教程,只需修改自己的数据集即可完成自己领域的任务和系统实现。 阅读详情

相关推荐

基于qiime2的16S数据分析全流程:从导入数据到下游分析一条龙

基于qiime2的16s测序数据分析分析激活qiime环境我已经把上面这句代码放在了.bashrc里面,因此激活qiime2环境只需要运行activate_qiime即可/bin/bash# 设置目录路径# 输出表头 echo -e "sample-id\tforward-absolute-filepath\treverse-absolute-filepath"# 遍历_R1和_R2文件do # 检查R1文件是否存在then# 获取样本ID(去掉_R1.fastq.gz)

2301_76771985的博客 5524

bigdecimal和double的那点儿事

1bigdecimal和double的相互转换问题 1.BigDecimal转double,使用BigDecimal类里面doubleValue()方法: BigDecimal latitude = 39.97268600; double latitudeDou = latitude.doubleValue() 2.double转BigDecimal,使用BigDecimal类里面valueOf()方法: double latitudeDou = 39.97268600; BigDecima

wqr111的博客 666

树莓派 SPI操作

扩展板配备一款0.96inch,128864分辨率的oled显示屏,通过SPI控制,先上显示效果图。由于程序过长,在这里我就不把代码全部贴出来了,只是简单讲解一下spi的操作函数。管脚如下如所有,左边方框的管脚分别为MOSI MISO SCLK,左边CE0,CE1为两个片选管脚,分别对应上图中的spidev0.0,spidev0.1两个设备。下载spidev库,复制到树莓派,并行运行如下命令解压安装。spi设备,此处设备为/dev/spi-decv0.0。在/dev路径下面,我们可以发现两个spi设备。

weixin_46529898的博客 914

java arith_Arith .java 加减乘除运算 | 学步园

package com.web.ccb.commons.arith;import java.math.BigDecimal;/*** 加减乘除运算* @author Administrator*/public class Arith {// 默认除法运算精度private static final int DEF_DIV_SCALE = 10;// 这个类不能实例化private Arith() ...

weixin_39555579的博客 957

解读Autoware.Universe规划模块:Behavior Path Planner

Behavior Path Planner是一个基于行为生成不同形态路径的路径规划器,负责生成 基于交通状况的路径(path), 车辆可以移动的可行驶区域(drivable area)(在路径消息中定义), 将被发送到车辆接口的转向信号(turn signal) 命令。

策 5491

软件测试——白盒测试实验报告,输入年月日算星期几

软件测试——白盒测试实验报告,输入年月日算星期几,测试用例设计和结果展示

weixin_52278161的博客 2746

BigDecimal类的加减乘除(解决double计算精度问题)

BigDecimal简介 Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使

qq_28270161的博客 7410

XTDrone——ALOAM与3D激光雷达三维SLAM(处理没有点云和坐标系报错的问题)

本文介绍了XTDrone中配置如何在三维环境中使用A-LOAM算法配合velodyneHDL32激光雷达包括依赖包安装、代码修改和PX4系统配置,以及相关报错细节的注意事项。

weixin_45390670的博客 1326

测试有不为零小数的Double或BigDecimal相乘的结果,关于小数问题

weixin_38819361的博客 230

通信原理 | 窗函数 | 矩形窗 | 汉宁窗 | 汉明窗 | 布莱克曼窗 | 补零对频谱的影响

比如,原信号是一个周期的余弦信号,又给它补了9个周期长度的0,那么信号并不是10个周期的余弦信号,而是一个周期的余弦加一串0,补零并没有带来新的信息!频谱分辨率的含义是两个频率不同的信号在频率上可分,也就要求他们不能落到一个频域函数的主瓣上,所以,如果待分析的两个信号频率接近,而时域长度又短,那么在频域上他们就落在一个频域函数的主瓣内了,补再多的零也无济于事。而形状(主瓣宽度)是由补零之前的信号长度决定的,补零的作用只是细化了频域序列,并没有改变其主瓣宽度。所以,汉宁窗牺牲了分辨率,换来了旁瓣泄露的减小。

若北辰 1305

【示波器专题】示波器探头的原理深入——有源探头之差分有源探头

差分有源探头是一种特殊的有源探头,与普通单端有源探头的区别在于其前端的放大器是差分放大器。差分放大器的好处是可以直接测试高速差分信号,同时其共模抑制比高,对共模噪声的抑制能力比较好。...

一点硬件 2625

BigDecimal加减乘除等计算详解

BigDecimal是Java编程语言中的一个类,用于处理任意精度的十进制数,特别适用于高精度计算场景。

C1226786216的博客 1868

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

java中double型_java中double型数据的加减乘除

java中double型数据的加减乘除public class Arith {private static final int DEF_DIV_SCALE = 10;/*** 两个Double数相加* @param v1* @param v2* @return Double*/public static Double add(Double v1,Double v2){BigDecimal b1 =...

weixin_26854475的博客 241

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

实现double数值的精度加减乘除运算

写一个Arith工具类实现double数值的精度加减乘除运算: import java.math.*; public class Arith { //默认除法运算精度 private static final int DEF_DIV_SCALE=10; //构造器私有,让这个类不能实例化 private Arith() {} /**

Dev_Lzf的专栏 1029

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

mysql double bigde_项目中BigDecimal与Double使用场景

金额要用BigDecimal金额计算不能用doube!!!!金额计算必须用BigDecimal,下面对比一下用double 跟BigDecimal的区别。先看一个小例子:请看题:示例1问, 结果是多少? 0.01?No! 结果是0.009999999999999998!为什么会这样呢? 因为float和double都是浮点数, 都有取值范围, 都有精度范围. 浮点数与通常使用的小数不同, 使用中,...

weixin_31100517的博客 1115

java double丢失精度问题,加减乘除计算出错出现99999

问题一 原理:在使用double计算时,经常会存在精度丢失,总是在一个正确的结果左右偏0.0000**1,经常会因为精度丢失而导致程序处理流程出错。所有在进行财务相关计算时,需要使用BigDecimal数据格式。 BigDecimal 在《EffectiveJava》这本书中也提到这个原则,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal。BigDecimal一共有4个够造方法,我们不关心用BigInteger来够造的那两个,..

卓怡工作室的博客 4317

[转] Float或Double浮点型计算精度问题的解决方法

转自:http://blog.youkuaiyun.com/bbg_0622/article/details/5616094 感谢原作者 BigDecimal 在《Effective Java》这本书中也提到这个原则,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal。BigDecimal一共有4个够造方法,我们...

weixin_33720078的博客 255

关于java中double类型的比较大小的问题

许多人在进行double比较大小时会遇到2.0-1.1!=0.9的问题,这主要和double的精度有关,涉及到double在计算机内的存储结构的问题,这个可以参考这篇博客:http://blog.youkuaiyun.com/softwater007/article/details/3330619,另外double类型的存储符合IEEE754标准,相关标准内容可以参考这篇博客:http://blog.csdn

z931284151的博客 3973

Float或Double浮点型计算导致小数点后面显示过长数据的解决方法

BigDecimal     在《Effective   Java》这本书中也提到这个原则,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用java.math.BigDecimal。BigDecimal一共有4个够造方法,我们不关心用BigInteger来够造的那两个,那么还有两个,它们是:     BigDecimal(double   v

BBG_0622的专栏 7361

java四舍五入和精度控制

Java中Double的高精度问题及bigdecimal解决方式 翻了点资料,在有的编程语言中提供了专门的货币类型来处理这种情况,但是Java没有。     四舍五入 我们的第一个反应是做四舍五入。Math类中的round方法不能设置保留几位小数,我们只能 象这样(保留两位): public double round(double value){     return Math.rou

Jeffreyjingsi的专栏 2232

关于java中Double类型的运算精度问题

关于java中Double类型的运算精度问题 public class Test{     public static void main(String args[]){         System.out.println(0.05+0.01);         System.out.println(1.0-0.42);         System.out.println(4.0

layman1024的博客 273

关于Java中float double 等计算精度问题

关键字 Java 浮点数 精确计算 问题的提出: 如果我们编译运行下面这个程序会看到什么? public class Test{ public static void main(String args[]){ System.out.println(0.05+0.01); System.out.println(1.0-0.42); System.out.println(4.015*100);...

Ethanxumf的博客 432

java中double型数据的加减乘除

java中double型数据的加减乘除 publicclassArith{privatestaticfinalintDEF_DIV_SCALE=10;/***两个Double数相加*@paramv1*@paramv2*@returnDouble*/publicstaticDoubleadd(Doublev1,Doublev2){BigDecimalb1=newBigDecimal(v1...

系统运维 212

java double类型精度_关于java中Double类型的运算精度问题

转自:http://blog.youkuaiyun.com/pttaag/article/details/5912171标题在Java中实现浮点数的精确计算AYellow(原作)修改关键字Java浮点数精确计算问题的提出:如果我们编译运行下面这个程序会看到什么?publicclassTest{publicstaticvoidmain(Stringargs[]){S...

weixin_39611072的博客 308

java浮点数误差_Java浮点数float和double精确计算的精度误差问题总结

1、float整数计算误差案例:会员积分字段采用float类型,导致计算会员积分时,7位整数的数据计算结果出现误差。原因:超出float精度范围,无法精确计算。float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。float:2^23 = 8388608,一共七位,这意味着最多能有7位有...

weixin_29414105的博客 758

JAVA中计算器的小数问题

<br />问题的提出:<br />  如果我们编译运行下面这个程序会看到什么?<br />  public class Test {<br />  public static void main(String args[]) {<br />  System.out.println(0.05 + 0.01);<br />  System.out.println(1.0 - 0.42);<br />  System.out.println(4.015 * 100);<br />  System.out.pri

springiscoming2008的专栏 2638
上一篇: nginx http自动跳转到https配置
下一篇: JDK8对List的简化操作-Lambda表达式
javaee1234
博客等级 码龄10年 49粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值