Class BigDecimalมีวิธีการที่เป็นประโยชน์ในการรับประกันการแปลงแบบไม่สูญเสีย
byteValueExact()shortValueExact()intValueExact()longValueExact()
อย่างไรก็ตามวิธีการfloatValueExact()และdoubleValueExact()ไม่ได้อยู่
ผมอ่านรหัสที่มา OpenJDK สำหรับวิธีการและfloatValue() doubleValue()ทั้งคู่ดูเหมือนจะย้อนกลับไปที่Float.parseFloat()และDouble.parseDouble()ตามลำดับซึ่งอาจส่งกลับอินฟินิตี้บวกหรือลบ ตัวอย่างเช่นการแยกสตริง 10,000 9s จะส่งกลับค่าบวกอนันต์ อย่างที่ฉันเข้าใจBigDecimalไม่มีแนวคิดเกี่ยวกับอินฟินิตี้ภายใน นอกจากนี้การแยกสตริงของ 100 9s ตามที่doubleให้1.0E100ซึ่งไม่ได้ไม่มีที่สิ้นสุด แต่สูญเสียความแม่นยำ
การใช้งานที่เหมาะสมคืออะไรfloatValueExact()และdoubleValueExact()?
ฉันคิดว่าเกี่ยวกับdoubleการแก้ปัญหาโดยการรวมBigDecimal.doubleValue(), BigDecial.toString(), Double.parseDouble(String)และDouble.toString(double)แต่มันดูยุ่ง ฉันต้องการถามที่นี่เพราะอาจมี (ต้อง!) เป็นวิธีที่ง่ายกว่า
เพื่อความชัดเจนฉันไม่ต้องการโซลูชันประสิทธิภาพสูง