怎么设置java的精度值_Java:如何为double值设置Precision?
本問題已經有最佳答案,請猛點這里訪問。
我最近正在處理數字,我有一種情況,我想將雙精度值的精度設置為6位或4位,這取決于數據庫中存儲的值。
例如,如果在數據庫中,精度設置為4位,則輸出必須如下所示:
10.0000。
我試過使用DecimalFormat和字符串##.####,但每次使用符號都很煩人。
有沒有更好的方法,比如說:
Double value = 10.0;
value.setPrecision(4);
它不是真正的復制品…
"安德烈爾"。為什么不呢?
為此,您可以嘗試bigdecimal
Double toBeTruncated = new Double("3.5789055");
Double truncatedDouble = BigDecimal.valueOf(toBeTruncated)
.setScale(3, RoundingMode.HALF_UP)
.doubleValue();
為什么沒有人投贊成票,這個答案很完美。
效果很好,"新雙"可以去掉
當我們調用doubleValue()時,是否會存在有損轉換?
嘗試double r1=bigdecimal.valueof(2.945777946674339e8d)。設置比例(3,RoundingMode.Half-up)。doubleValue();---您得到2.94577794667e8。輸出看起來與您的要求不同。
這個答案不是從一個double值開始的,該值立即將其排除在法庭之外,而且在所有案件中都不能給出正確的結果,因為它不能。這是不可能的。
這是一個簡單的方法。
String formato = String.format("%.2f");
它將預設值設置為2位數o any。
如果你只想用這種方式打印。
System.out.printf("%.2f",123.234);
這很簡單,效果很好,謝謝。
只是澄清一下:double myDouble = 42.99; String formatted = String.format("%.2f", myDouble);。
不能將雙精度(或雙精度)設置為指定的小數位數,因為浮點值沒有小數位數。它們有二進制數字。
您必須轉換為十進制基數,可以通過BigDecimal或DecimalFormat,這取決于您以后要對該值做什么。
另請參閱我對這個問題的回答,以反駁不可避免的*100/100答案。
設定雙值的精度是很好的技術。例如,使用這個類import java.text.DecimalFormat并創建它的對象
double no=12.786;
DecimalFormat dec = new DecimalFormat("#0.00");
System.out.println(dec.format(no));
所以它將在小數點后兩位數字,這里它將打印12.79
OP已經拒絕了這個解決方案,天知道為什么。
"EJP,為什么?"!!!
這個代碼段有什么問題嗎?
"安德烈爾"。我已經表達了我的困惑。我沒有什么要補充的。你的問題應該交給手術室,而不是我。
這對我很有用:
public static void main(String[] s) {
Double d = Math.PI;
d = Double.parseDouble(String.format("%.3f", d)); ?// can be required precision
System.out.println(d);
}
很完美。優雅的解決方案。
這是一種通過兩個警告來實現結果的有效方法。
將精度限制為"最大"n位(不固定為n位)。
四舍五入數字(不是四舍五入到最近的數字)。
請參見此處的示例測試用例。
123.12345678 ==> 123.123
1.230000 ==> 1.23
1.1 ==> 1.1
1 ==> 1.0
0.000 ==> 0.0
0.00 ==> 0.0
0.4 ==> 0.4
0 ==> 0.0
1.4999 ==> 1.499
1.4995 ==> 1.499
1.4994 ==> 1.499
這是密碼。我上面提到的兩個注意事項可以很容易地解決,但是速度對我來說比準確性更重要,所以我把它放在這里。與數學運算相比,像System.out.printf("%.2f",123.234);這樣的字符串操作在計算上代價很高。在我的測試中,與字符串操作相比,下面的代碼(沒有sysout)花費了1/30的時間。
public double limitPrecision(String dblAsString, int maxDigitsAfterDecimal) {
int multiplier = (int) Math.pow(10, maxDigitsAfterDecimal);
double truncated = (double) ((long) ((Double.parseDouble(dblAsString)) * multiplier)) / multiplier;
System.out.println(dblAsString +" ==>" + truncated);
return truncated;
}
double和float的精度取決于它們的大小和實現IEEE浮點類型的方式。
另一方面,輸出中的小數位數是格式問題。你是正確的,一次又一次地輸入相同的常量是個壞主意。您應該聲明一個字符串常量,并使用它的符號表示。
private static final String DBL_FMT ="##.####";
使用符號表示可以更改使用常量的所有位置的精度,而無需搜索代碼。
BigDecimal value = new BigDecimal(10.0000);
value.setScale(4);
要擴展@ejp,在處理雙打時"精確"的概念是非常令人擔憂的。正如在https://stackoverflow.com/a/3730040/390153中所討論的,無論精度如何,您甚至不能將0.1表示為雙精度,同樣的原因是您不能以有限精度表示10進制中的1/3。
您需要考慮要解決的問題,并考慮:
a)我應該首先使用雙打嗎;如果精度是一個相關概念,那么使用雙打很可能是一個錯誤。
b)如果雙打合適,我所說的精確是什么意思?如果你只談論顯示,把邏輯包裝在一個顯示函數中,你只需要在一個地方處理它,即應用干燥原理。
也許這個方法可以幫助您精確計算雙精度值。
double truncate(double number)
{
int integerPart = (int) number;
double fractionalPart = number - integerPart;
fractionalPart *= 100; ?//It is for upto two decimal values after point.
//You can increase the zeros to fulfill your needs.
int fractPart = (int) fractionalPart;
fractionalPart = (double) (integerPart) + (double) (fractPart)/100;
return fractionalPart;
}
此方法將允許設置精度級別。
double truncate(double number, int precision)
{
double prec = Math.pow(10, precision);
int integerPart = (int) number;
double fractionalPart = number - integerPart;
fractionalPart *= prec;
int fractPart = (int) fractionalPart;
fractionalPart = (double) (integerPart) + (double) (fractPart)/prec;
return fractionalPart;
}
public static String setPrecision(String number, int decimal) {
double nbr = Double.valueOf(number);
int integer_Part = (int) nbr;
double float_Part = nbr - integer_Part;
int floating_point = (int) (Math.pow(10, decimal) * float_Part);
String final_nbr = String.valueOf(integer_Part) +"." + String.valueOf(floating_point);
return final_nbr;
}
簡單的解決方案是使用=>double.parsedouble(string.format("%.3f",d))。
我在頂部看到了答案:
Double toBeTruncated = new Double("3.5789055");
Double truncatedDouble = BigDecimal.valueOf(toBeTruncated)
.setScale(3, RoundingMode.HALF_UP)
.doubleValue();
我認為這不是一個完美的答案,因為在很多情況下,當你打電話給doubleValue()時,答案會改變。
例:BigDecimal.valueOf(toBeTruncated).setScale(3, RoundingMode.HALF_UP)的輸出為12.500,
然后在.doubleValue()之后,輸出將為12.5,即精度丟失。
解決方案:要么使用不帶.doubleValue()方法的BigDecimal類型顯示,要么在最終答案后使用字符串格式。
我是這樣的,任何人讀到這個,12.5和12.500是完全相同的數字。沒有12.500這樣的東西。這是一種視覺格式。
總結
以上是生活随笔為你收集整理的怎么设置java的精度值_Java:如何为double值设置Precision?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中dateformat类的作用_
- 下一篇: java中完成md5加密解密_java实