go语言小数运算,go语言位运算

【10】Go语言运算符及运算符的优先级

运算符用于在程序运行时执行数学或逻辑运算。

创新互联是一家集网站建设,武穴企业网站建设,武穴品牌网站建设,网站定制,武穴网站建设报价,网络营销,网络优化,武穴网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

1.算术运算符

Go 语言的算术运算符如图,假设A值为10,B值为20。

2.关系运算符

Go 语言的关系运算符如图,假设A值为10,B值为20。

3.逻辑运算符

Go 语言的逻辑运算符如图。假定A值为True,B值为False。

4.位运算符

位运算符对整数在内存中的二进制位进行操作。

位运算符比一般的算术运算符速度要快,而且可以实现一些算术运算符不能实现的功能。如果要开发高效率程序,位运算符是必不可少的。

Go 语言的位运算符如图。假定 A = 60,B = 13,其二进制数转换如下。

A = 0011 1100

B = 0000 1101

5.赋值运算符

Go 语言的赋值运算符如图。

6.其他运算符

Go 语言的其他运算符如图。

运算符的优先级

所谓优先级,就是当多个运算符出现在同一个表达式中时,先执行哪个运算符。

go使用decimal

在公司项目中看到关于钱的数据在接口展示、添加修改的各种情况下结构体中相应字段用的都是string类型。觉得不太合理,因此查阅了一些资料,整理如下。

在网上搜到一篇博客:

在程序计算中涉及到钱的时候,为什么要用Decimal而不是Float

博客中介绍,如果用float类型再转为decimal类型时会造成精度丢失。转为string后再转为decimal则可以解决问题,保证精度。看着好像是很完美的回答了我想要了解的问题,但仔细一看用的语言是python,于是我便亲自试了下:

结果确实如此,但看版本是2.7,我怀疑是不是python2.7版本落后,因此存在问题,于是又换了python3,再次测试:

结论依然是一样。好吧,证实了,对于python确实应该先转为string再转为decimal。

但是,python是这样,难道go也是这样吗,于是我又开始了进一步测试:

go中decimal使用第三方库

这里是直接用float64转为decimal,并没有通过string中转,结果输出如下:

乍一看,看着好像是精度丢失了似的,但是对比后我们发现,float64和decimal前后都是一致的,也就是说float64转为decimal之后,保持了原样。那些看起来小数点后位数很多的结果,是因为float64浮点类型计算产生的问题,跟转换并没有关系。

为了验证这一结论,我又写了下面的测试:

不使用浮点类型相加,而用decimal类型相加,这样输出结果果然没问题了:

因此我们可以得出结论:对于go语言,在把float转换为decimal类型时,并不需要像python一样通过string中转,也依然可以保持精度。进一步,我们也可以想到上面的问题,对于钱,在结构体字段中,我们完全可以直接使用float类型,并不需要用string类型。而且好处时,使用float数值类型,无论对于前端还是后端,在进行数值范围验证的时候,会更方便,不必把string转为float后再验证了。

上面提到了decimal包,我们这里简单看下,里面的常用的方法:

定义decimal的几种方式:

decimal数值运算

比较:

我们再看下浮点精度运算不准确的原因,这篇文章讲解的比较细

浮点精度(float、double)运算不精确的原因

精度运算不准确这是为什么呢?我们接下来就需要从计算机所有数据的表现形式二进制说起了。如果大家很了解二进制与十进制的相互转换,那么就能轻易的知道精度运算不准确的问题原因是什么了。

接下来我们看一个简单的例子 2.1 这个十进制数转成二进制是什么样子的。

落入无限循环结果为 10.0001100110011........ , 我们的计算机在存储小数时肯定是有长度限制的,所以会进行截取部分小数进行存储,从而导致计算机存储的数值只能是个大概的值,而不是精确的值。从这里看出来我们的计算机根本就无法使用二进制来精确的表示 2.1 这个十进制数字的值,连表示都无法精确表示出来,计算肯定是会出现问题的。

1、为什么数值表示用decimal 不用double

2、在程序计算中涉及到钱的时候,为什么要用Decimal而不是Float

3、MySQL数据类型DECIMAL用法

4、浮点精度(float、double)运算不精确的原因

Golang标准库——math

返回x和y中最大值,特例如下:

返回x和y中最小值,特例如下:

返回一个标准化小数frac和2的整型指数exp,满足f == frac * 2**exp,且0.5 = Abs(frac) 1;特例如下:

第一类贝塞尔函数,n阶。特例如下:

MaxBase是字符串转换函数接受的最大进制。

创建一个值为x的*Int。

将z设为-x并返回z。

返回一个uint32类型的非负的32位伪随机数。

返回一个取值范围在[0,n)的伪随机int值,如果n=0会panic。

Go语言基础语法(一)

本文介绍一些Go语言的基础语法。

先来看一个简单的go语言代码:

go语言的注释方法:

代码执行结果:

下面来进一步介绍go的基础语法。

go语言中格式化输出可以使用 fmt 和 log 这两个标准库,

常用方法:

示例代码:

执行结果:

更多格式化方法可以访问中的fmt包。

log包实现了简单的日志服务,也提供了一些格式化输出的方法。

执行结果:

下面来介绍一下go的数据类型

下表列出了go语言的数据类型:

int、float、bool、string、数组和struct属于值类型,这些类型的变量直接指向存在内存中的值;slice、map、chan、pointer等是引用类型,存储的是一个地址,这个地址存储最终的值。

常量是在程序编译时就确定下来的值,程序运行时无法改变。

执行结果:

执行结果:

Go 语言的运算符主要包括算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符以及指针相关运算符。

算术运算符:

关系运算符:

逻辑运算符:

位运算符:

赋值运算符:

指针相关运算符:

下面介绍一下go语言中的if语句和switch语句。另外还有一种控制语句叫select语句,通常与通道联用,这里不做介绍。

if语法格式如下:

if ... else :

else if:

示例代码:

语法格式:

另外,添加 fallthrough 会强制执行后面的 case 语句,不管下一条case语句是否为true。

示例代码:

执行结果:

下面介绍几种循环语句:

执行结果:

执行结果:

也可以通过标记退出循环:

--THE END--


本文标题:go语言小数运算,go语言位运算
文章地址:http://scyanting.com/article/hohphg.html