Java 将BigDecimal转换为字符串的正确方法

Java 将BigDecimal转换为字符串的正确方法,java,bigdecimal,Java,Bigdecimal,为什么要使用valueOf()? 为什么我不能使用隐式转换 代码段如下所示: BigDecimal xmlvalue = new BigDecimal(12.3434379328948927894789237); String str1 = String.valueOf(xmlvalue); //Option 1 String str2 = "" + xmlvalue; //Option 2 您可以使用将BigDecimal转换为字符串您可以使用toString()方法 xmlvalue.to

为什么要使用
valueOf()
? 为什么我不能使用隐式转换

代码段如下所示:

BigDecimal xmlvalue = new BigDecimal(12.3434379328948927894789237);
String str1 = String.valueOf(xmlvalue); //Option 1
String str2 = "" + xmlvalue; //Option 2

您可以使用将BigDecimal转换为字符串

您可以使用
toString()
方法

xmlvalue.toString();

有人可能会说,使用
valueOf(x)
比使用
“+x
更具可读性。在内部,两者都将退回到
toString
,但它们也可以处理空值(其中
null.toString()
将抛出
NullPointerException

从理论上讲,
valueOf(x)
的性能应该优于
“”+x
,因为后者在内部使用
StringBuilder
,这可能会导致一些开销

当您知道您的
BigDecimal
为非空时(如您的示例中所示),您应该只使用
toString

顺便说一下,要小心使用
BigDecimal(double)
构造函数。更安全的方法是使用
new BigDecimal(“12.3434379328948927894789237”)
在您的示例中。
BigDecimal(double)
不可推翻的原因在中解释,原因有两个:

  • 使用
    String.valueOf
    可以更好地表达您的意图:您显然试图获得BigDecimal值的字符串表示形式;滥用字符串连接需要更多的脑力劳动来理解您试图做什么
  • 它可能更快:使用连接将在内部创建一个StringBuilder,它连接两个字符串,然后调用toString()到自身(尽管编译器可能足够聪明,可以摆脱这些不必要的操作)

  • 为什么要手动使用
    “”+string
    转换为string?我知道很多开发人员都使用它,但在我看来,这就像是利用了Java的开发人员友好性,以及它自动完成很多事情(terminus Technical“转换”)的事实。换句话说,这是一种懒惰的方式,我不喜欢在
    String.valueOf()
    正是为了这个目的而实现时强奸Java

    技术回答:

    a+“
    与整数
    a
    一起使用时。其行为如下:

    String.valueOf(a) + new String("");
    
    这将创建两个字符串对象,而
    String.valueOf(a)
    只使用一个。

    本例中的String#valueOf use方法

    我认为是更好的使用方法。例如,如果要转换回此数据,最好使用此toString方法

    如果 使用 BigDecimal(String)构造函数,则原始值将 恢复了


    使用BigDecimal不会恢复在
    double
    中丢失的精度。如果您需要超过15位的精度,则需要使用String和BigDecimal

    BigDecimal xmlvalue = new BigDecimal("12.3434379328948927894789237");
    String str1 = xmlvalue.toString(); // Simplest Option 
    
    如果你有一个
    double
    ,你也可以这样做

    // creating BigDecimal here doesn't help unless you do rounding.
    String str1 = String.valueOf(d); 
    

    我认为更好的方法是使用class-
    java.text.DecimalFormat
    ,因为在实际场景中,像
    BigDecimal
    这样的数字类表示的实际值与其字符串表示之间没有关系,尽管您还没有列出希望为完全不同类型的数据提供字符串值的原因

    在我看来,字符串表示完全是关于格式的&这个
    DecimalFormat
    类可以让您更好地控制它,例如,我需要将一些
    BigDecimal
    值写入文本文件,不同的值需要采用不同的格式

    Java文档的一部分

    DecimalFormat是NumberFormat的一个具体子类,用于格式化 十进制数。它有各种各样的功能设计来实现它 可以在任何语言环境中解析和格式化数字,包括支持 用于西文、阿拉伯文和印度文数字。它还支持不同的应用程序 数的种类,包括整数(123)、定点数 (123.4%)、科学记数法(1.23E4)、百分比(12%)和货币 数额(123美元)。所有这些都可以本地化


    选项2有什么问题?为什么不能使用它?为什么不使用String str=xmlvalue.toString()?检查下面的链接您在技术上是正确的,但是您必须假设创建两个对象实际上是一个问题。事实并非如此,Java是一个对象创建和清理性能野兽。最好让它处理引擎盖下发生的优化,并主要关注可读代码。编辑:这可能意味着你的建议仍然有效,但原因不同!