四捨六入:
value,
_:= strconv.
parsefloat
(fmt.
sprintf
("%.2f"
,9.824),
64)fmt.
println
(value)
value,
_= strconv.
parsefloat
(fmt.
sprintf
("%.2f"
,9.826),
64)fmt.
println
(value)
第三位為5且5之後有有效數字,滿足五入:
value,
_:= strconv.
parsefloat
(fmt.
sprintf
("%.2f"
,9.8251),
64)fmt.
println
(value)
value,
_= strconv.
parsefloat
(fmt.
sprintf
("%.2f"
,9.8351),
64)fmt.
println
(value)
第三位為5且5之後沒有有效數字:
網上有人說,第二位為奇數則進製,第二位為偶數則捨去,例如:
value,
_:= strconv.
parsefloat
(fmt.
sprintf
("%.2f"
,9.825),
64)fmt.
println
(value)
value,
_= strconv.
parsefloat
(fmt.
sprintf
("%.2f"
,9.835),
64)fmt.
println
(value)
但是:
value,
_:= strconv.
parsefloat
(fmt.
sprintf
("%.2f"
,9.815),
64)fmt.
println
(value)
居然捨去了
value,
_= strconv.
parsefloat
(fmt.
sprintf
("%.2f"
,9.845),
64)fmt.
println
(value)
居然進製了
所以,如果想滿足正常的四捨五入邏輯,最好不要使用sprintf處理。
fmt.
println
(math.
trunc
(9.815
*1e2
+0.5)*
1e-2
)fmt.
println
(math.
trunc
(9.825
*1e2
+0.5)*
1e-2
)fmt.
println
(math.
trunc
(9.835
*1e2
+0.5)*
1e-2
)fmt.
println
(math.
trunc
(9.845
*1e2
+0.5)*
1e-2
)
以上結果顯示符合四捨五入,但是偶爾會出現精度問題:
fmt.
println
(math.
trunc
(3.3
*1e2
+0.5)*
1e-2
)fmt.
println
(math.
trunc
(3.3000000000000003
*1e2
+0.5)*
1e-2
)
n10 := math.
pow10(2
) fmt.
println
(math.
trunc((
9.815
+0.5
/n10)
*n10)
/ n10)
fmt.
println
(math.
trunc((
9.825
+0.5
/n10)
*n10)
/ n10)
fmt.
println
(math.
trunc((
9.835
+0.5
/n10)
*n10)
/ n10)
fmt.
println
(math.
trunc((
9.845
+0.5
/n10)
*n10)
/ n10)
fmt.
println
(math.
trunc((
3.3+
0.5/n10)
*n10)
/ n10)
fmt.
println
(math.
trunc((
3.3000000000000003
+0.5
/n10)
*n10)
/ n10)
符合四捨五入規則。
如果要固定顯示兩位小數,需轉換為string型別,前提是傳入的數值,已經做過兩位小數處理,否則依舊有進製問題:
value := strconv.
formatfloat(3
,'f',2
,64) fmt.
println
(value)
value = strconv.
formatfloat
(3.3
,'f',2
,64) fmt.
println
(value)
0value = strconv.
formatfloat
(9.815
,'f',2
,64) fmt.
println
(value)
被捨去
value = strconv.
formatfloat
(9.82
,'f',2
,64) fmt.
println
(value)
錯誤示例:
n10 := math.pow10(2)
fmt.println(math.trunc((129.975+0.5/n10)*n10) / n10) // 129.97
fmt.println(math.trunc((34423.125+0.5/n10)*n10) / n10) // 34423.12
**修改:
結果如下:
9.82 9.83 9.83
9.82 9.83 9.84 9.85
3.3 3.3 3
129.98 34423.13
四捨五入保留兩位小數
1.double x2 0.5698 system.out.println string.format 2f x1 2.以指定的捨入模式格式化雙精度浮點型小數 param d 需格式化小數 param precision 保留小數字數 param roundingmode 捨入模式 return p...
保留兩位小數,四捨五入方法
c 中的math.round 並不是使用的 四捨五入 法。其實c 的round函式都是採用banker s rounding 銀行家演算法 即 四捨六入五取偶 math.round 0.4 result 0 math.round 0.6 result 1 math.round 0.5 result ...
sql 保留兩位小數 四捨五入
而資料庫實際上寫入的資料分別為 不管是總彙總資料還是條目彙總資料都是根據,每一條出庫資料,是以單價為組,單價 總面積的和得到每條細目的 或者是總 在sql處理的過程中計算擷取了兩位,造成了有些資料直接截掉,沒有按照四捨五入的規則,出現了0.01的誤差。sql計算預設保留精度。處理資料的時候要經常用到...