开发语言中的两个浮点数相加

我们先来看看两个数据的相加

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中的注意点

  1. 从上述代码中new BigDecimal(0.1)new BigDecimal("0.1")的结果是一样的
  2. 需要下载decimal
go get github.com/shopspring/decimal
  1. 查看是否可以访问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中的注意点
  1. 从上述代码中new BigDecimal(0.1)new BigDecimal("0.1")的结果是不一样的

  2. 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中表达为如下效果

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自己的九又四分之三站台

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值