概述
我们先来看看两个数据的相加
0.1+0.2
我们看一下在C#、Java、python、GO
中两个数的相加
1. 各开发语言
1.1. C#
- 代码
static void Main(string[] args)
{
DoubleAdd();
Console.ReadKey();
}
private static void DoubleAdd()
{
double d1 = 0.1;
double d2 = 0.2;
Console.WriteLine(d1 + d2);
Console.WriteLine(d1 + d2 == 0.3);
}
- 输出
0.30000000000000004
False
1.2. Go
- 代码
package main
import(
"fmt"
)
func main() {
var num1 float64 = 0.1
var num2 float64 = 0.2
num3:=num1+num2
fmt.Println(num3)
fmt.Println(num3==0.3)
}
- 输出
1.3. Python
- 代码
num1=0.1
num2=0.2
print(num1+num2)
print(num1+num2==0.3)
- 输出
1.4. Java
- 代码
Double num_1=0.1;
Double num_2=0.2;
System.out.println(num_1+num_2);
System.out.println(num_1+num_2==0.3);
- 输出
2. 产生原因
是由于上述语言使用的是IEEE_754-1985
标准,
外网访问地址如下:https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/IEEE_754-1985
知乎大神讲解:https://zhuanlan.zhihu.com/p/343033661
3. 解决方法
3.1. C#
- 代码
static void Main(string[] args)
{
DoubleAdd();
Console.ReadKey();
}
private static void DoubleAdd()
{
double d1 = 0.1;
double d2 = 0.2;
Console.WriteLine(d1 + d2);
Console.WriteLine(d1 + d2 == 0.3);
Console.WriteLine("------------------------我是邪恶的分界线----------------------------------");
decimal dc1 = 0.1m;
decimal dc2 = 0.2m;
Console.WriteLine(dc1 + dc2);
Console.WriteLine(dc1 + dc2 == 0.3m);
}
- 输出
3.2. python
- 代码
import decimal
num1=0.1
num2=0.2
print(num1+num2)
print(num1+num2==0.3)
print("----------------------------------我是邪恶的分界线----------------------------------")
a=decimal.Decimal('0.1')
b=decimal.Decimal('0.2')
print(a+b)
print(a+b==decimal.Decimal('0.3'))
- 输出
3.3. Go
- 代码
package main
import(
"fmt"
"github.com/shopspring/decimal"
)
func main() {
var num1 float64 = 0.1
var num2 float64 = 0.2
num3:=num1+num2
fmt.Println(num3)
fmt.Println(num3==0.3)
fmt.Println("----------------------------------我是邪恶的分界线----------------------------------")
dcNum1:= decimal.NewFromFloat(0.1)
dcNum2:= decimal.NewFromFloat(0.2)
dcnum3:=dcNum1.Add(dcNum2)
sum,_ := dcnum3.Float64()
fmt.Println(sum)
fmt.Println(sum==0.3)
fmt.Println("----------------------------------我是邪恶的分界线----------------------------------")
dcNum1,_= decimal.NewFromString(".1")
dcNum2,_= decimal.NewFromString(".2")
dcnum3=dcNum1.Add(dcNum2)
sum,_ = dcnum3.Float64()
fmt.Println(sum)
fmt.Println(sum==0.3)
}
-
输出
-
Go中的注意点
- 从上述代码中
new BigDecimal(0.1)
和new BigDecimal("0.1")
的结果是一样的
- 需要下载
decimal
go get github.com/shopspring/decimal
- 查看是否可以访问github,如果2无法成功可以先查看一下github的连通情况
3.4. Java
- 代码
Double num_1=0.1;
Double num_2=0.2;
System.out.println(num_1+num_2);
System.out.println(num_1+num_2==0.3);
System.out.println("----------------------------------我是邪恶的分界线----------------------------------");
BigDecimal decimalNum1=new BigDecimal(0.1);
BigDecimal decimalNum2=new BigDecimal(0.2);
BigDecimal decimalNum3=decimalNum1.add(decimalNum2);
System.out.println(decimalNum3.doubleValue());
System.out.println(decimalNum3.doubleValue()==0.3);
System.out.println("----------------------------------BigDecimal我是邪恶的分界线----------------------------------");
decimalNum1=new BigDecimal("0.1");
decimalNum2=new BigDecimal("0.2");
decimalNum3=decimalNum1.add(decimalNum2);
System.out.println(decimalNum3.doubleValue());
System.out.println(decimalNum3.doubleValue()==0.3);
- 输出
Java中的注意点
-
从上述代码中
new BigDecimal(0.1)
和new BigDecimal("0.1")
的结果是不一样的
-
Java BigDecimal的主要函数
-
构造器描述
- BigDecimal(int) 创建一个具有参数所指定整数值的对象。
- BigDecimal(double) 创建一个具有参数所指定双精度值的对象。 //不推荐使用
- BigDecimal(long) 创建一个具有参数所指定长整数值的对象。
- BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。//推荐使用
-
方法描述
- add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象。
- subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
- multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象。
- divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象。
- toString() 将BigDecimal对象的数值转换成字符串。
- doubleValue() 将BigDecimal对象中的值以双精度数返回。
- floatValue() 将BigDecimal对象中的值以单精度数返回。
- longValue() 将BigDecimal对象中的值以长整数返回。
- intValue() 将BigDecimal对象中的值以整数返回。
所以最终复杂的等式在Java中表达为如下效果
将BigDecimal对象的数值转换成字符串。
- doubleValue() 将BigDecimal对象中的值以双精度数返回。
- floatValue() 将BigDecimal对象中的值以单精度数返回。
- longValue() 将BigDecimal对象中的值以长整数返回。
- intValue() 将BigDecimal对象中的值以整数返回。
所以最终复杂的等式在Java中表达为如下效果
最后
以上就是坚强手套为你收集整理的开发语言中的两个浮点数相加1. 各开发语言2. 产生原因3. 解决方法的全部内容,希望文章能够帮你解决开发语言中的两个浮点数相加1. 各开发语言2. 产生原因3. 解决方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复