Double只能处理16位有效数精度,在某些情况下精度对其需求是不够的,所以就有了BigDecimal。因为BigDecimal的精度范围的范围大,所以在问我们的开发业务中对精度要求高的属性,就需要BigDecimal来进行存储计算,防止精度丢失。这里我主要介绍一下BigDecimal的加,减,乘,除。四种基础计算。
首先准备两个BigDecimal类型的数
// new第一个参数
BigDecimal num1 = new BigDecimal(20.5555555555);
// new第二个参数
BigDecimal num2 = new BigDecimal(10.5555555554);
精度类 MathContext:
MathContext可以自己定义保留的有效数字位数:
MathContext mathContext = new MathContext(2);
其中2是指有效数字位数。MathContext类还有几个默认参数分别是:
MathContext.UNLIMITED = 不限制精度 采用四舍五入
MathContext.DECIMAL32 = 7位有效数字 采用“最接近的”数字舍入
MathContext.DECIMAL64 = 16位有效数字 采用“最接近的”数字舍入
MathContext.DECIMAL128 = 34位有效数字 采用“最接近的”数字舍入
加法可以使用MathContext来确定有效数字位数:
// BigDecimal的加法 有两种 一种无精度入参 一种有精度入参
// 无精度入参 num1减去num2
BigDecimal addNum1 = num1.add(num2);
// 有精度入参
// MathContext.UNLIMITED = 不限制精度
// MathContext.DECIMAL32 = 7位有效数字
// MathContext.DECIMAL64 = 16位有效数字
// MathContext.DECIMAL128 = 34位有效数字
MathContext mathContext = new MathContext(2);
BigDecimal addNum2 = num1.add(num2, MathContext.DECIMAL32);
减法可以使用MathContext来确定有效数字位数:
// BigDecimal的减法 有两种 一种无精度入参 一种有精度入参
// 无精度入参
BigDecimal subNum1 = num1.subtract(num2);
// 有精度入参
BigDecimal subNum2 = num1.subtract(num2,MathContext.DECIMAL32);
乘法可以使用MathContext来确定有效数字位数
// BigDecimal的乘法 有两种 一种无精度入参 一种有精度入参
// 无精度入参
BigDecimal mulNum1 = num1.multiply(num2);
// 有精度入参
BigDecimal mulNum2 = num1.multiply(num2,MathContext.DECIMAL32);
其中除法有很多不同入参的方法,以下举例4种:
// BigDecimal的除法
// 无精度入参
BigDecimal divNum1 = num1.divide(num2);
// 有精度入参 MathContext
BigDecimal divNum2 = num1.divide(num2,MathContext.DECIMAL32);
// 有精度入参 RoundingMode RoundingMode.HALF_UP -> 四舍五入精度
BigDecimal divNum3 = num1.divide(num2, RoundingMode.HALF_UP);
// 有精度入参 RoundingMode RoundingMode.HALF_UP -> 四舍五入精度 scale 表示四舍五入到几位小数
BigDecimal divNum4 = num1.divide(num2,2, RoundingMode.HALF_UP)
package useful;
import java.math.BigDecimal;
public class StudyBigDecimal {
public static void main(String[] args) {
String s1 = "1.30";
String s2 = "-0.40";
StudyBigDecimal studyBigDecimal = new StudyBigDecimal();
String r = studyBigDecimal.add(s1, s2);
System.out.println(r);
}
public String add(String s1,String s2) {
BigDecimal b1 = new BigDecimal(String.valueOf(s1));
BigDecimal b2 = new BigDecimal(String.valueOf(s2));
BigDecimal b3 = b1.add(b2);
return b3.toString();
}
public void other(String s1,String s2) {
BigDecimal b1 = new BigDecimal(String.valueOf(s1));
BigDecimal b2 = new BigDecimal(String.valueOf(s2));
BigDecimal b3 = b1.subtract(b2); //减法运算
BigDecimal b4 = b1.multiply(b2); //乘法运算
BigDecimal b5 = b1.divide(b2); //除法运算
}
}
Java BigDecimal转化为字符串(科学计数法)的三种方法
介绍BigDecimal的3个toString方法的区别。
toEngineeringString:有必要时使用工程计数法。工程记数法是一种工程计算中经常使用的记录数字的方法,与科学计数法类似,但要求10的幂必须是3的倍数
toPlainString:不使用任何指数(永不使用科学计数法)
toString:有必要时使用科学计数法
import java.math.BigDecimal;
public class Test {
public static void main(String[] args) {
BigDecimal number = new BigDecimal("1E11");
System.out.println(number.toEngineeringString());
System.out.println(number.toPlainString());
System.out.println(number.toString());
}
}
输出:
100E+9
100000000000
1E+11
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
这是一道面试题,我没有答对,但还是很好奇怎么解。你有N个人的大家庭,分别是1,2,3,...,N岁。你想给你的大家庭拍张照片。所有的家庭成员都排成一排。“我是家里的friend,建议家庭成员安排如下:”1岁的家庭成员坐在这一排的最左边。每两个坐在一起的家庭成员的年龄相差不得超过2岁。输入:整数N,1≤N≤55。输出:摄影师可以拍摄的照片数量。示例->输入:4,输出:4符合条件的数组:[1,2,3,4][1,2,4,3][1,3,2,4][1,3,4,2]另一个例子:输入:5输出:6符合条件的数组:[1,2,3,4,5][1,2,3,5,4][1,2,4,3,5][1,2,4,5,3][
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub