DecimalFormat 小数位数

发布于 2024-11-19 10:28:53 字数 1788 浏览 0 评论 0原文

目前,我在 JTable 中显示了具有 3 位小数的 BigDecimal 值。当我得到的值为 2.500 或 1.000 时,我想要 2.5 和 1.0。这就是我尝试这个的原因:

                    BigDecimal value;
                BigDecimal value3 = new BigDecimal((String)model.getValueAt(e.getLastRow(), 1)).setScale(3, BigDecimal.ROUND_HALF_UP);
                BigDecimal value2 = new BigDecimal((String)model.getValueAt(e.getLastRow(), 1)).setScale(2, BigDecimal.ROUND_HALF_UP);
                if(valor3.equals(value2))
                {
                    BigDecimal value1 = new BigDecimal((String)model.getValueAt(e.getLastRow(), 1)).setScale(1, BigDecimal.ROUND_HALF_UP);
                    if(value3.equals(value1))
                        value = valuer1;
                    else
                        value = value2;
                }
                else
                    value = value3;

但它不起作用。看起来 '2.500'.equals('2.5') 是错误的。

我还尝试在其渲染器中为 JTable 提供格式:

 class paramRenderer extends DefaultTableCellRenderer
{
    private final DecimalFormat formatter = new DecimalFormat( "#.000" );

    public void setValue() {    
        formatter.setMinimumFractionDigits(1);
        formatter.setMaximumFractionDigits(3);
    }
}

但这根本没有区别。

还有其他想法吗?

编辑:最后我在互联网上找到了一个解决方案:

BigDecimal trim(BigDecimal n)
{
    try
    {
        while (true)
        {
            n = n.setScale(n.scale()-1);
        }
    }
    catch (ArithmeticException e)
    {
        // Not "real" error: No more trailing zeroes -> Just exit // setScale() tries to eliminate a non-zero digit -> Out of the loop // Remember exceptions are not recommended for exiting loops, but this seems to be the best way...
    }

    return n;
}

并且效果很好!无论如何,非常感谢您的帮助:)

Currently, I have BigDecimal values with 3 decimal places shown in a JTable. When i get values as 2.500 or 1.000, I want to have 2.5 and 1.0 instead. That's why I tried this:

                    BigDecimal value;
                BigDecimal value3 = new BigDecimal((String)model.getValueAt(e.getLastRow(), 1)).setScale(3, BigDecimal.ROUND_HALF_UP);
                BigDecimal value2 = new BigDecimal((String)model.getValueAt(e.getLastRow(), 1)).setScale(2, BigDecimal.ROUND_HALF_UP);
                if(valor3.equals(value2))
                {
                    BigDecimal value1 = new BigDecimal((String)model.getValueAt(e.getLastRow(), 1)).setScale(1, BigDecimal.ROUND_HALF_UP);
                    if(value3.equals(value1))
                        value = valuer1;
                    else
                        value = value2;
                }
                else
                    value = value3;

But it doesn't work. It looks like '2.500'.equals('2.5') were false.

I also tried to give format to the JTable at its renderer:

 class paramRenderer extends DefaultTableCellRenderer
{
    private final DecimalFormat formatter = new DecimalFormat( "#.000" );

    public void setValue() {    
        formatter.setMinimumFractionDigits(1);
        formatter.setMaximumFractionDigits(3);
    }
}

But it makes no difference at all.

Any other idea?

EDIT: Finaly I found over the Internet a solution:

BigDecimal trim(BigDecimal n)
{
    try
    {
        while (true)
        {
            n = n.setScale(n.scale()-1);
        }
    }
    catch (ArithmeticException e)
    {
        // Not "real" error: No more trailing zeroes -> Just exit // setScale() tries to eliminate a non-zero digit -> Out of the loop // Remember exceptions are not recommended for exiting loops, but this seems to be the best way...
    }

    return n;
}

And works great! Thank you very much for the help anyway :)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

花桑 2024-11-26 10:28:53
  • 第一个比较是错误的,因为您有不同的比例 - value2 有 2,value3 有 3。如果您使它们相同,那么
  • 如果您只想显示内容,则不需要 BigDecimal。小数格式应该可以使用,但您还应该将最大小数位数设置为 1
  • the first comparison is false, because you have different scales - value2 has 2 and value3 has 3. If you make them the same, it works
  • you don't need BigDecimal if you only want to display things. The decimal format should work, but you should also set the maximum fraction digits to 1
烂人 2024-11-26 10:28:53

尝试使用此格式 #.0## 作为格式化程序

Try this format #.0## for the formatter

oО清风挽发oО 2024-11-26 10:28:53

尝试这样做,

DecimalFormat df = new DecimalFormat("#.#");
df.format(2.500);   // returns 2.5
df.format(1.000);   // returns 1.0

Try to do like this,

DecimalFormat df = new DecimalFormat("#.#");
df.format(2.500);   // returns 2.5
df.format(1.000);   // returns 1.0
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文