Golang四捨五入保留兩位小數

2022-08-23 14:51:15 字數 4109 閱讀 1702

四捨六入:

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計算預設保留精度。處理資料的時候要經常用到...