【问题标题】:Java Double to BigDecimal Conversion Without E Notation没有 E 表示法的 Java Double 到 BigDecimal 转换
【发布时间】:2021-06-14 13:58:57
【问题描述】:

在JDK8中:

   import java.math.BigDecimal;
    public class HelloWorld{
    
         public static void main(String []args){
             Double aDouble=new Double(295699630);
            System.out.println(BigDecimal.valueOf(aDouble.doubleValue()));
           
         }
    }

给出输出: 2.9569963E+8 。 数字以零结尾(如 295699630,848436700)带有符号 E。 但是如果数字以任何非零数字结尾,那么上面的代码 sn-p 会为我们提供所需的输出(数字如:295699631 将不包含'E' 转换后)。这是什么原因&我们如何在这种转换中避免科学记数法“E”?需要不带“E”记法的 BigDecimal 格式(非字符串)输出。 任何帮助将不胜感激。提前致谢。

【问题讨论】:

  • What is reason of this 原因是因为这就是制造商决定toString() 函数的适当输出。 how we can avoid scientic notation 'E' in this conversion 正如下面提到的 Enak,有一个 toPlainString() 方法不使用指数形式。
  • 感谢您的意见。但是我们需要数字格式而不是字符串格式的输出。 toPlainString() 方法返回字符串。
  • 如果您正在寻找特定格式,请更新您的问题。在System.out.println() 语句中使用该值会隐含地告诉读者您需要String,因为这是打印语句通常使用的。
  • 我认为您误解了 System.out.println() 的作用。当给定一个对象作为参数时,该方法固有地使用对象toString() 方法。如果您希望在使用 System.out.println() 显示其内容时使用不同格式的值,那么您需要使用不同的方法来格式化 Object 的 String 表示形式,在这种情况下为 toPlainString()

标签: java java-8 double bigdecimal


【解决方案1】:

只需查看 API。 BigDecimal 有一个 toPlainString 方法

返回此 BigDecimal 的字符串表示形式,不带指数字段。

https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html#toPlainString--

【讨论】:

  • 需要数字格式的输出。 BigDecimal.toPlainString() 返回我们的字符串。
  • 我不明白你想在这里实现什么。如果你想用它计算,就不要关心它的字符串表示,因为它无关紧要。如果要打印,请使用我提到的功能。
  • “数字格式”是什么意思?您希望输出是什么类型
  • 嗨 Enak,从 Double 转换为 BigDecimal 后,我们需要在 API 的响应中发送转换后的 BigDecimal 值。这就是为什么我们不能使用 BigDecimal.toPlainString() 方法,因为客户端会寻找 BigDecimal 值而不是 String 值。
  • 然后发送BigDecimal。如果您在System.out.print 函数中使用任何Object,则会调用对象的toString 方法。科学记数法仅用于表示为字符串。您可能会发送序列化的BigDecimal 而不是字符串。所以不要关心它的字符串表示。
【解决方案2】:

在从 Double 到 BigDecimal 的转换过程中,我们可以使用 setScale 方法来避免科学记数法 'E'。按照下面的代码sn-p:

import java.math.BigDecimal;
    
 import org.apache.commons.lang3.math.NumberUtils;
    
    public class test {
    
        public static void main(String[] args) {
            Double aDouble = NumberUtils.createDouble("345444330");
            System.out.println(BigDecimal.valueOf(aDouble.doubleValue()));//Output:3.4544433E+8
            BigDecimal b = new BigDecimal(aDouble).setScale(2);//Output:345444330.00 
            System.out.println(b);
    
        }
    
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多