在本文中,我们将详细介绍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计算)
- .net double类型转string类型的坑
- 001.java安卓double类型String类型相互转换 android java double to String
- c++中double类型控制小数位数
- 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类型的坑
之前项目当中的接入的高德逆地理编码功能偶尔会出现参数错误的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
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类型控制小数位数
有时,我们需要输出确定小数位数的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类型的数值计算
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类型的数值计算的相关知识,请在本站寻找。
本文标签: