首先,我应该澄清,我问这个问题只是为了得到启发;我并不急于得到一个答案,但一个答案可能会帮助我更欣赏BigDecimal类.
我一直有--现在仍然有--关于小数点后保证只有一定位数的小数值的哲学.以美元数字为例,小数点后的位数保证不超过2位.在为这类应用程序编写代码时,我显然不能使用带有舍入误差的浮点数.相反,我会使用一个整数(或LONG或BigInteger,取决于数字可能达到的高度)来表示美分的数字.例如,我会将$12.34的数字存储和处理为整数1234.只有在输出美元数字时(可能在输入美元数字时),我才会用小数点格式化数字.
但现在我正在读一本介绍BigDecimal类的Java书.它甚至在一些例子中使用了美元数字.我对此不感兴趣,因为我觉得除法可能会很尴尬,除非你知道怎么做.
假设您正在编写一个将美元数字除以的程序.例如,也许许多人想平分这笔钱.比方说,有一天程序运行的参数应该是1.21美元除以3.你会希望程序得出40美分的结果,余数是1美分.换句话说,结果应该是0.40和0.01.如果将数字存储为代表美分数字的整数,则可以很好地工作.但它能与代表美元的BigDecimals一起使用吗?
显然,这段代码不会起作用:
import java.math.BigDecimal;
public class test {
public static void main(String[] args) {
BigDecimal total = new BigDecimal("1.21");
BigDecimal divider = new BigDecimal(3);
BigDecimal results[]= new BigDecimal[2];
results = total.divideAndRemainder(divider);
for (BigDecimal result : results) System.out.println(result);
}
}
您将得到0.00和1.21的结果,而不是您想要的0.40和0.01.
这本书暗示,解决方案是设定规模.所以我试了试:
BigDecimal total = new BigDecimal("1.21");
total = total.setScale(2);
BigDecimal divider = new BigDecimal(3);
divider = divider.setScale(2);
BigDecimal results[]= new BigDecimal[2];
results = total.divideAndRemainder(divider);
结果仍为0.00和1.21.
也许结果应该放在已经设置了刻度的变量中?我试过了:
BigDecimal total = new BigDecimal("1.21");
total = total.setScale(2);
BigDecimal divider = new BigDecimal(3);
divider = divider.setScale(2);
BigDecimal results[]= new BigDecimal[2];
results[0] = new BigDecimal(0);
results[0] = results[0].setScale(2);
results[1] = new BigDecimal(0);
results[1] = results[0].setScale(2);
results = total.divideAndRemainder(divider);
那真是太尴尬了!结果仍然是一样的.
当然,我可以将1.21美元乘以100,然后再除以3,然后再除以100,但这将是一个很好的理由,可以首先使用我的整数方法并跳过这些步骤.有没有一种优雅的方式来划分BigDecimal值?或者我应该坚持以整数存储分值?