6.Golang数字操作

Go 语言具有严格的静态类型限制,运算符操作的数字类型必须是相同类型数据。且数字操作不能超出该类型的取值范围,不然计算溢出得到的结果就是错的。

一、加减乘除、取模

package main

import "fmt"

func main() {
    // 加 +
    var ui1, ui2 uint8
    ui1 = 1
    ui2 = 2
    ui := ui1 + ui2
    fmt.Println(ui) // 输出:3

    ui += 255
    fmt.Println(ui) // 溢出后计算的值就是错的,输出:2

    // 减 -
    var i, j int32
    i = 10
    j = 5
    fmt.Println(i - j) // 输出:5

    // 乘 *
    var f1, f2 float32
    f1 = 1.2
    f2 = 0.2
    // 浮点型的数字计算有精度问题,float32 精度6位小数,float64 精度15位小数,
    fmt.Println(f1 * f2) // 输出:0.24000001

    // 除 /
    n1 := 10
    n2 := 3
    fmt.Println(n1 / n2) // 输出:3,小数被丢弃

    // 求模、取余 %
    fmt.Println(n1 % n2) // 输出余数:1
}

二、位运算
位运算是直接对数字在内存中存储的二进制数进行操作,所以性能上来讲是最快的运算方式。位运算一般常见于需要性能优化或复杂的算法中。位运算只作用于整数类型上。
Go 语言中的位运算符:

运算符 释义 运算规则
& 按位与,两个数对应的二进制位相与 同时为1,则为1,否则为0
| 按位或,两个数对应的二进制位相或 有一个为1,则为1,否则为0
^ 按位异或,两个数对应的二进制位相异或 二进制位不同,则为1,否则为0
&^ 按位清空 x&^y 如果ybit位上的数是0则取x上对应位置的值,如果ybit位上为1则结果位上取0
<< 左移 所有二进制位左移运算符右边指定的位数,高位丢弃,低位补0。左移n位就是乘以2的n次方
>> 右移 所有二进制位右移运算符右边指定的位数,高位补0,低位丢弃。右移n位就是除以2的n次方
package main

import "fmt"

func main() {
    var i1, i2, n uint8 // 1个字节

    // 按位与 &
    i1 = 2         // 二进制:0000 0010
    i2 = 3         // 二进制:0000 0011
    n = i1 & i2    // 按位与:0000 0010
    fmt.Println(n) // 输出:2

    // 按位或 |
    i1 = 10        // 二进制:0000 1010
    i2 = 20        // 二进制:0001 0100
    n = i1 | i2    // 按位或:0001 1110
    fmt.Println(n) // 输出:30

    // 按位异或 ^
    i1 = 3         // 二进制:0000 0011
    i2 = 4         // 二进制:0000 0100
    n = i1 ^ i2    // 按位异或:0000 0111
    fmt.Println(n) // 输出:7

    // 按位清空 &^
    i1 = 10        // 二进制:0000 1010
    i2 = 20        // 二进制:0001 0100
    n = i1 &^ i2   // 按位清空:0000 1010
    fmt.Println(n) // 输出:10

    // 左移 <<
    i1 = 5         // 二进制 0000 0101
    n = i1 << 2    // 左移2位:0001 0100
    fmt.Println(n) // 输出:20

    // 右移 >>
    i2 = 15        // 二进制:0000 1111
    n = i2 >> 2    // 右移2位:0000 0011
    fmt.Println(n) // 输出:3
}

三、比较大小
大小比较得到的类型时布尔型。运算符:>大于、>=大于等于、<小于、<=小于等于、==等于。

package main

import "fmt"

func main() {
    fmt.Println(2 > 1)  // 输出:true
    fmt.Println(1 == 2) // 输出:false
}

四、数字类型转换
整型从高位类型转低位类型会有精度丢失,浮点型转整型会丢失小数点后的值,复数型转非复数整型时符号丢失。数据类型转换格式:目标类型(转换类型)

package main

import "fmt"

func main() {
    // 整型转浮点型
    var i int = 1
    fmt.Printf("%f\n", float32(i)) // 输出:1.000000

    // 浮点型转整型
    var f float32 = 3.1415926
    fmt.Printf("%d\n", int(f)) // 输出:3,小数后丢失

    // float32 转 float64
    fmt.Printf("%v\n", float64(f)) // 输出:3.141592502593994,6位后的小数精度是错误的

    // float64 转 float32
    var f2 float64 = 3.141592653589793
    fmt.Println("%v\n", float32(f2)) // 输出:3.1415927,6位后的小数精度是错误的
}

五、数字转字符串
使用 strconv 包中定义的函数做数字和字符串转换。

package main

import (
    "fmt"
    "strconv"
)

func main() {
    // int 转 string
    var i int = 111
    var s string
    s = strconv.Itoa(i) // 数字转字符串
    fmt.Println(s)

    // string 转 int
    i2, err := strconv.ParseInt(s, 10, 64) // 把 s 转为10进制64位数
    if err == nil {
        fmt.Println(i2) // 输出:111
    }

    // float 转 string
    var f float64 = 3.1415926535
    s1 := strconv.FormatFloat(f, 'f', -1, 64)
    fmt.Println(s1) // 输出:3.1415926535
    // 第二个参数选项,含义如下:
    // 'b' (-ddddp±ddd,二进制指数)
    // 'e' (-d.dddde±dd,十进制指数)
    // 'E' (-d.ddddE±dd,十进制指数)
    // 'f' (-ddd.dddd,没有指数)
    // 'g' ('e':大指数,'f':其它情况)
    // 'G' ('E':大指数,'f':其它情况)

    // string 转 float
    str := `3.1415926535`
    v1, err := strconv.ParseFloat(str, 32) // ParseFloat 函数默认返回float64类型数据,转成folat32可能会有精度丢失
    if err == nil {
        fmt.Printf("%v\n", v1) // 输出:3.1415927410125732
    }
    v2, err := strconv.ParseFloat(str, 64)
    if err == nil {
        fmt.Printf("%v\n", v2) // 输出:3.1415926535
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,923评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,154评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,775评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,960评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,976评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,972评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,893评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,709评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,159评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,400评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,552评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,265评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,876评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,528评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,701评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,552评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,451评论 2 352

推荐阅读更多精彩内容