GVKun编程网logo

Java中Double类型的精确计算(java double计算)

27

在本文中,我们将详细介绍Java中Double类型的精确计算的各个方面,并为您提供关于javadouble计算的相关解答,同时,我们也将为您带来关于.netdouble类型转string类型的坑、00

在本文中,我们将详细介绍Java中Double类型的精确计算的各个方面,并为您提供关于java double计算的相关解答,同时,我们也将为您带来关于.net double类型转string类型的坑、001.java安卓double类型String类型相互转换 android java double to String、c++中double类型控制小数位数、double类型的数值计算的有用知识。

本文目录一览:

Java中Double类型的精确计算(java double计算)

Java中Double类型的精确计算(java double计算)

 

import java.math.BigDecimal;
public class DoubleUtil {
    
    private static final int DEF_DIV_SCALE = 5; // 小数点后的保留位数
    
    /**
     * Double精确的加法运算
     * @param d1 被加数
     * @param d2 加数
     * @return 两个参数的和
     */
    public static double add( double d1, double d2 ) {
        BigDecimal value1 = new BigDecimal( Double.toString(d1) );
        BigDecimal value2 = new BigDecimal( Double.toString(d2) );
        return value1.add(value2).doubleValue();
    }
    
    /**
     * Double精确的减法运算
     * @param d1 被减数
     * @param d2 减数
     * @return 两个参数的差
     */
    public static double sub( double d1, double d2 ) {
        BigDecimal value1 = new BigDecimal( Double.toString(d1) );
        BigDecimal value2 = new BigDecimal( Double.toString(d2) );
        return value1.subtract(value2).doubleValue();
    }
    
     /**
      * Double精确的乘法运算
      * @param d1 被乘数
      * @param d2 乘数
      * @return 两个参数的积
      */
    public static Double mul( double d1, double d2 ) {
        BigDecimal value1 = new BigDecimal( Double.toString(d1) );
        BigDecimal value2 = new BigDecimal( Double.toString(d2) );
        return value1.multiply(value2).doubleValue();
    }
    
    /**
      * Double精确的除法运算, 当出现除不尽的情况时, 精确到小数点以后10位, 以后的数字四舍五入
      * @param d1 被除数
      * @param d2 除数
      * @return 两个参数的商
      */
    public static double div( double d1, double d2 ) {
        return div( d1, d2, DEF_DIV_SCALE );
    }
    
    /**
     * Double精确的除法运算, 当出现除不尽的情况时, 精确到小数点以后10位, 以后的数字四舍五入
     * @param d1 被除数
     * @param d2 除数
     * @param scale 表示需要精确到小数点的后几位
     * @return 两个参数的商
     */
    public static double div( double d1, double d2, int scale ) {
        if ( scale < 0 ) {
            throw new IllegalArgumentException( "参数[scale]必须是正整数或者零" );
        }
        BigDecimal value1 = new BigDecimal( Double.toString(d1) );
        BigDecimal value2 = new BigDecimal( Double.toString(d2) );
        return value1.divide( value2, scale, BigDecimal.ROUND_HALF_UP ).doubleValue();
    }

}

 

.net double类型转string类型的坑

.net double类型转string类型的坑

之前项目当中的接入的高德逆地理编码功能偶尔会出现参数错误的bug,经过排查服务端异常log,发现请求的url中的location参数中的小数点变成了逗号。

代码如下

public async Task<MapResult> GetMapResultAsync(double lat, double lng)
        {
            string url = string.Format("http://restapi.amap.com/v3/geocode/regeo?output=json&location={0},{1}&key={2}", 
                lng.ToString(), lat.ToString(), GouldAk);
            GolderMapResult res;
            try
            {

                string json = await HttpHelper.GetAsync(url);
                json = json.Replace("[]", "\"\"");
                res = JsonConvert.DeserializeObject<GolderMapResult>(json);
                if (res.resultBase.addressComponentBase.city.IsNullOrWhiteSpace())
                    res.resultBase.addressComponentBase.city = res.resultBase.addressComponentBase.province;
            }
            catch (Exception ex)
            {
                Logger.Error("请求高德地图失败:" + url);
                throw ex;
            }
            if (res.status != 1)
            {
                Logger.Error("请求高德地图失败");
                throw new UserFriendlyException("请求高德地图失败,状态码:" + res.status + " 说明:" + res.info + " url:" + url);
            }
                
            return res;
        }

其中 lng.ToString(), lat.ToString() 转换string的时候,偶尔会把中间的点号转成逗号,于是造成高德api返回参数错误。

后来在网上查找原因,参考这篇博客http://blog.chinaunix.net/uid-9255716-id-107923.html

对于用“.”分隔千位,用“,”分隔小数的国家,1,234.56 将会格式化成 1.234,56。如果您需要结果无论在什么语言下都是一样的,就请使用 CultureInfo.InvariantCulture 作为语言。

接下来就简单了,贴修改后的代码

public async Task<MapResult> GetMapResultAsync(double lat, double lng)
        {
            string url = string.Format("http://restapi.amap.com/v3/geocode/regeo?output=json&location={0},{1}&key={2}", 
                lng.ToString(CultureInfo.InvariantCulture), lat.ToString(CultureInfo.InvariantCulture), GouldAk);
            GolderMapResult res;
            try
            {

                string json = await HttpHelper.GetAsync(url);
                json = json.Replace("[]", "\"\"");
                res = JsonConvert.DeserializeObject<GolderMapResult>(json);
                if (res.resultBase.addressComponentBase.city.IsNullOrWhiteSpace())
                    res.resultBase.addressComponentBase.city = res.resultBase.addressComponentBase.province;
            }
            catch (Exception ex)
            {
                Logger.Error("请求高德地图失败:" + url);
                throw ex;
            }
            if (res.status != 1)
            {
                Logger.Error("请求高德地图失败");
                throw new UserFriendlyException("请求高德地图失败,状态码:" + res.status + " 说明:" + res.info + " url:" + url);
            }
                
            return res;
        }

只是把 lng.ToString(), lat.ToString() 替换成了 lng.ToString(CultureInfo.InvariantCulture), lat.ToString(CultureInfo.InvariantCulture) ,这样这个bug就解决了。

001.java安卓double类型String类型相互转换 android java double to String

001.java安卓double类型String类型相互转换 android java double to String

String str1 = "12.345";

double d = Double.parseDouble(str) * 1.5;

//Log.i("double",d);        //1 错误: 不兼容的类型: double无法转换为String

String str2 = String.format("%.2f", d);

Log.i("String", str2);

c++中double类型控制小数位数

c++中double类型控制小数位数

  有时,我们需要输出确定小数位数的double,可以先引入如下头文件:

#include <iomanip>

 

  然后通过下列方式输出:

double zzz = 8.66666;
  cout << fixed << setprecision(2) << zzz << endl;

  

  或者:

if ((aid % (int(allTime / deltaT) / files)) == 0) {
            cout << fixed << setprecision(0) << double(curTime / allTime) * 100 << "% has been calculated..." << endl;
   }

 

double类型的数值计算

double类型的数值计算

package jiajian;

public class jiajian {
	public static void main(String[] args) {
		System.out.println("0.05+0.01=" +(0.05+0.01));
		System.out.println("1.0-0.42=" +(1.0-0.42));
		System.out.println("4.015*100="+(4.015*100));
		System.out.println("123.3/100="+(123.3/100));
	}

}

 

这个涉及到二进制与十进制的转换问题。N进制可以理解为:数值×基数的幂,例如我们熟悉的十进制数123.4=1×10²+2×10+3×(10的0次幂)+4×(10的-1次幂);其它进制的也是同理,例如二进制数11.01=1×2+1×(2的0次幂)+0+1×(2的-2次幂)=十进制的3.25。double类型的数值占用64bit,即64个二进制数,除去最高位表示正负符号的位,在最低位上一定会与实际数据存在误差(除非实际数据恰好是2的n次方)。

结论:使用double类型的的数值进行计算,其结果是不精确的。

关于Java中Double类型的精确计算java double计算的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于.net double类型转string类型的坑、001.java安卓double类型String类型相互转换 android java double to String、c++中double类型控制小数位数、double类型的数值计算的相关知识,请在本站寻找。

本文标签: