怎么设置java的精度值_Java:如何为double值设置Precision?
本问题已经有最佳答案,请猛点这里访问。
我最近正在处理数字,我有一种情况,我想将双精度值的精度设置为6位或4位,这取决于数据库中存储的值。
例如,如果在数据库中,精度设置为4位,则输出必须如下所示:
10.0000。
我试过使用DecimalFormat和字符串##.####,但每次使用符号都很烦人。
有没有更好的方法,比如说:
Double value = 10.0;
value.setPrecision(4);
它不是真正的复制品…
"安德烈尔"。为什么不呢?
为此,您可以尝试bigdecimal
Double toBeTruncated = new Double("3.5789055");
Double truncatedDouble = BigDecimal.valueOf(toBeTruncated)
.setScale(3, RoundingMode.HALF_UP)
.doubleValue();
为什么没有人投赞成票,这个答案很完美。
效果很好,"新双"可以去掉
当我们调用doubleValue()时,是否会存在有损转换?
尝试double r1=bigdecimal.valueof(2.945777946674339e8d)。设置比例(3,RoundingMode.Half-up)。doubleValue();---您得到2.94577794667e8。输出看起来与您的要求不同。
这个答案不是从一个double值开始的,该值立即将其排除在法庭之外,而且在所有案件中都不能给出正确的结果,因为它不能。这是不可能的。
这是一个简单的方法。
String formato = String.format("%.2f");
它将预设值设置为2位数o any。
如果你只想用这种方式打印。
System.out.printf("%.2f",123.234);
这很简单,效果很好,谢谢。
只是澄清一下:double myDouble = 42.99; String formatted = String.format("%.2f", myDouble);。
不能将双精度(或双精度)设置为指定的小数位数,因为浮点值没有小数位数。它们有二进制数字。
您必须转换为十进制基数,可以通过BigDecimal或DecimalFormat,这取决于您以后要对该值做什么。
另请参阅我对这个问题的回答,以反驳不可避免的*100/100答案。
设定双值的精度是很好的技术。例如,使用这个类import java.text.DecimalFormat并创建它的对象
double no=12.786;
DecimalFormat dec = new DecimalFormat("#0.00");
System.out.println(dec.format(no));
所以它将在小数点后两位数字,这里它将打印12.79
OP已经拒绝了这个解决方案,天知道为什么。
"EJP,为什么?"!!!
这个代码段有什么问题吗?
"安德烈尔"。我已经表达了我的困惑。我没有什么要补充的。你的问题应该交给手术室,而不是我。
这对我很有用:
public static void main(String[] s) {
Double d = Math.PI;
d = Double.parseDouble(String.format("%.3f", d)); // can be required precision
System.out.println(d);
}
很完美。优雅的解决方案。
这是一种通过两个警告来实现结果的有效方法。
将精度限制为"最大"n位(不固定为n位)。
四舍五入数字(不是四舍五入到最近的数字)。
请参见此处的示例测试用例。
123.12345678 ==> 123.123
1.230000 ==> 1.23
1.1 ==> 1.1
1 ==> 1.0
0.000 ==> 0.0
0.00 ==> 0.0
0.4 ==> 0.4
0 ==> 0.0
1.4999 ==> 1.499
1.4995 ==> 1.499
1.4994 ==> 1.499
这是密码。我上面提到的两个注意事项可以很容易地解决,但是速度对我来说比准确性更重要,所以我把它放在这里。与数学运算相比,像System.out.printf("%.2f",123.234);这样的字符串操作在计算上代价很高。在我的测试中,与字符串操作相比,下面的代码(没有sysout)花费了1/30的时间。
public double limitPrecision(String dblAsString, int maxDigitsAfterDecimal) {
int multiplier = (int) Math.pow(10, maxDigitsAfterDecimal);
double truncated = (double) ((long) ((Double.parseDouble(dblAsString)) * multiplier)) / multiplier;
System.out.println(dblAsString +" ==>" + truncated);
return truncated;
}
double和float的精度取决于它们的大小和实现IEEE浮点类型的方式。
另一方面,输出中的小数位数是格式问题。你是正确的,一次又一次地输入相同的常量是个坏主意。您应该声明一个字符串常量,并使用它的符号表示。
private static final String DBL_FMT ="##.####";
使用符号表示可以更改使用常量的所有位置的精度,而无需搜索代码。
BigDecimal value = new BigDecimal(10.0000);
value.setScale(4);
要扩展@ejp,在处理双打时"精确"的概念是非常令人担忧的。正如在https://stackoverflow.com/a/3730040/390153中所讨论的,无论精度如何,您甚至不能将0.1表示为双精度,同样的原因是您不能以有限精度表示10进制中的1/3。
您需要考虑要解决的问题,并考虑:
a)我应该首先使用双打吗;如果精度是一个相关概念,那么使用双打很可能是一个错误。
b)如果双打合适,我所说的精确是什么意思?如果你只谈论显示,把逻辑包装在一个显示函数中,你只需要在一个地方处理它,即应用干燥原理。
也许这个方法可以帮助您精确计算双精度值。
double truncate(double number)
{
int integerPart = (int) number;
double fractionalPart = number - integerPart;
fractionalPart *= 100; //It is for upto two decimal values after point.
//You can increase the zeros to fulfill your needs.
int fractPart = (int) fractionalPart;
fractionalPart = (double) (integerPart) + (double) (fractPart)/100;
return fractionalPart;
}
此方法将允许设置精度级别。
double truncate(double number, int precision)
{
double prec = Math.pow(10, precision);
int integerPart = (int) number;
double fractionalPart = number - integerPart;
fractionalPart *= prec;
int fractPart = (int) fractionalPart;
fractionalPart = (double) (integerPart) + (double) (fractPart)/prec;
return fractionalPart;
}
public static String setPrecision(String number, int decimal) {
double nbr = Double.valueOf(number);
int integer_Part = (int) nbr;
double float_Part = nbr - integer_Part;
int floating_point = (int) (Math.pow(10, decimal) * float_Part);
String final_nbr = String.valueOf(integer_Part) +"." + String.valueOf(floating_point);
return final_nbr;
}
简单的解决方案是使用=>double.parsedouble(string.format("%.3f",d))。
我在顶部看到了答案:
Double toBeTruncated = new Double("3.5789055");
Double truncatedDouble = BigDecimal.valueOf(toBeTruncated)
.setScale(3, RoundingMode.HALF_UP)
.doubleValue();
我认为这不是一个完美的答案,因为在很多情况下,当你打电话给doubleValue()时,答案会改变。
例:BigDecimal.valueOf(toBeTruncated).setScale(3, RoundingMode.HALF_UP)的输出为12.500,
然后在.doubleValue()之后,输出将为12.5,即精度丢失。
解决方案:要么使用不带.doubleValue()方法的BigDecimal类型显示,要么在最终答案后使用字符串格式。
我是这样的,任何人读到这个,12.5和12.500是完全相同的数字。没有12.500这样的东西。这是一种视觉格式。
怎么设置java的精度值_Java:如何为double值设置Precision?相关推荐
- java exe 返回值_java调用exe返回值
{// getAccount 方法,使用 get 方法; return accounts.get(index); } } Bank .java: package com.mybank.domain; ...
- java变量默认值_Java变量的默认值和初始化
Java变量的默认值和初始化 学习自 <Thinking In Java> 变量的默认值 注意只有成员变量才有默认值,而局部变量必须要赋初值.为什么会这么设计,下面会讨论. 关于各种基础类 ...
- java对象默认值_java对象的默认值
2.4.1 字段和方法 定义一个类时(我们在Java里的全部工作就是定义类.制作那些类的对象以及将消息发给那些对象),可在自己的类里设置两种类型的元素:数据成员(有时也叫"字段") ...
- java开根号函数_Java中真的只有值传递么?
原创: ITwalking 转载于公众号[ 编程大道] (本文非引战或diss,只是说出自己的理解,欢迎摆正心态观看或探讨) 回顾值传递和引用传递 关于Java是值传递还是引用传递,网上有不一样的说法 ...
- java integer的范围_java integer的取值范围是什么?
Java Integer取值范围 Integer类取值和 int 类型取值一致,取值范围是从-2147483648 至 2147483647 ,包括-2147483648 和 2147483647. ...
- win7 docker java开发环境变量_java – Docker. Spring应用程序.设置和获取环境变量
我正试图将我的Spring应用程序停靠. 问题: 我无法从我的Spring应用程序中获取docker容器中的环境变量. Spring配置(2个选项,单独试用) 也试过java URI dbUrl = ...
- java设置器或访问器_java里面的构造器、设置器、访问器的作用
java里面的构造器是一个与类同名的特殊的方法,称为构造方法,在创建类的对象时使用,用于对象初始化. 设置器是一个针对类的某个私有属性成员属性的有特殊命名要求的方法,发XXX属性,应为setXXX.主 ...
- Java设置短信间隔时间_Java实现短信验证码--设置发送间隔时间,以及有效时间(Java+Redis)...
标签:url control operation 短信验证码 reg cep ppi 任务 用户 Java实现短信验证码--设置发送间隔时间,以及有效时间(Java+R ...
- java语言环境变量_JAVA语言环境变量的设置教程
本文主要向大家介绍了JAVA语言环境变量的设置教程,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. 安装JDK到目录,我这里是C:\Java 右键点击计算机属性 在系统变量里面建 JA ...
最新文章
- IT人的自我导向型学习:学习的1个理念和2个心态
- 遮挡摄像头 判断_长治一学校门口树枝遮挡信号灯,危险!
- 【PPT下载】第二批PPT干货限时免费分享
- android 图片缓存工具类,Android工具类系列-Glide图片缓存与圆角
- JavaScript之闭包
- JQuery.autocomplete扩展功能:实现多列自动提示
- 关于gcc扩展中的宏定义中用 # 和 ##
- JAVA中的通用文件下载接口
- 使用Selenium定位鼠标悬浮出现的下拉菜单
- [文摘]Java正则表达式详解
- 二分专题(不定期更新)
- nvme命令中prp_linux里的nvme驱动代码分析(加载初始化)
- java贪吃蛇_Java贪吃蛇游戏完善版
- RayData学习总结
- R费希尔精确检验(Fisher‘s exact test)
- mocha java mv_代码覆盖Mocha
- 如何做一份淹没的水深分布图
- SMB Signing not required
- 爱立信发布人体通信技术:最高传输10Mbps
- 自动控制原理02 数学模型