关于java BCD码的运算支持?

alloy_alloy 2008-01-24 02:17:30
使用java进行高精度的商业运算(BCD号运算),如税务货币运算,可以使用BigDecimal进行,

但想格式化BCD运算结果好像没有配合BigDecimal类的,DecimalFormat我用了,

它好像是在进行浮点存储的格式化。

请指教:
1.java中使用什么格式化BigDecimal?
可以随意格式化为科学计数法等,无论BigDecimal中的数据多么大。

2.数据库中的存储运算,是使用的BCD号吗?


谢谢!
...全文
739 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiangliu520 2010-08-20
  • 打赏
  • 举报
回复
我的结果也是
0.11111111111111111111111111111111111111111111111111
0.11111111111111111111111111111111111111111111111111
alloy_alloy 2008-01-24
  • 打赏
  • 举报
回复
请其他人测试一下这段代码!

有愿意测试的吗?

我的JDK为 1.4.2 32位操作系统!

---------------------
还在寻找BCD码的Format工具类!java中是否有现成的,
难道需要自己写!
老紫竹 2008-01-24
  • 打赏
  • 举报
回复
我这里输出为
[code=INIFile]0.11111111111111111111111111111111111111111111111111
0.11111111111111111111111111111111111111111111111111[/code]
alloy_alloy 2008-01-24
  • 打赏
  • 举报
回复
DecimalFormat.getNumberInstance()

调用的实际也是NumberFormat.getNumberInstance()

DecimalFormat继承NumberFormat根本没有覆盖它的getNumberInstance()方法!

输出结果依然同上!

感谢你的热心!
老紫竹 2008-01-24
  • 打赏
  • 举报
回复
我的应用精度足够了,你可以替换为
    String s = "0.";
for (int i = 0; i < 50; i++) {
s = s + "1";
}
// --使用BCD码,进行高精度商业运算.
BigDecimal bd = new BigDecimal(s);
DecimalFormat db = new DecimalFormat();
NumberFormat nf = DecimalFormat.getNumberInstance(); // 这个精度高,可惜我用不到,你也许用得上吧
nf.setGroupingUsed(false);
nf.setMinimumFractionDigits(50);
nf.setMaximumFractionDigits(50);
String fmt = nf.format(bd);
System.out.println(bd);
System.out.println(fmt);
alloy_alloy 2008-01-24
  • 打赏
  • 举报
回复
java2000_net 你好:
如下代码:
String s = "0.";
for (int i = 0; i < 50; i++)
{
s = s + "1";
}
// --使用BCD码,进行高精度商业运算.
BigDecimal bd = new BigDecimal(s);

DecimalFormat db = new DecimalFormat();

NumberFormat nf = NumberFormat.getNumberInstance();
nf.setGroupingUsed(false);
nf.setMinimumFractionDigits(50);
nf.setMaximumFractionDigits(50);
String fmt = nf.format(bd);

System.out.println(bd);
System.out.println(fmt);
输出:
0.11111111111111111111111111111111111111111111111111
0.11111111111111110000000000000000000000000000000000

可以看出NumberFormat.getNumberInstance得到的实例不是在对BCD码进行格式化,
而是,转换为了浮点存储!
老紫竹 2008-01-24
  • 打赏
  • 举报
回复
精度的损失?那是你的fraction 不够大,而且这个代码是显示时候用的。

一般货币显示,小数点2位足以, 最长的,我只见过4位小数点的。
alloy_alloy 2008-01-24
  • 打赏
  • 举报
回复
java2000_net 你好:

按您的代码使用NumberFormat 好像有精度的损失!!!

NumberFormat.getNumberInstance得到的实例在format时,进行的好像不是BCD的运算???
老紫竹 2008-01-24
  • 打赏
  • 举报
回复
SQL Server 有对应的 Decimal 类型
Oracle 有 Number

其它的用的少,没注意了!
老紫竹 2008-01-24
  • 打赏
  • 举报
回复
我一般用NumberFormat

  private static NumberFormat nf = NumberFormat.getNumberInstance();

public static String toString(BigDecimal bd, int fraction, boolean group) {
if (bd == null) {
return "";
}
nf.setGroupingUsed(group); // 是否显示千位分割符
nf.setMaximumFractionDigits(fraction); // 最大精度
nf.setMinimumFractionDigits(fraction); // 最小精度
return nf.format(bd);
}

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧