我是靠谱客的博主 坚强手套,最近开发中收集的这篇文章主要介绍开发语言中的两个浮点数相加1. 各开发语言2. 产生原因3. 解决方法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

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

在这里插入图片描述

最后

以上就是坚强手套为你收集整理的开发语言中的两个浮点数相加1. 各开发语言2. 产生原因3. 解决方法的全部内容,希望文章能够帮你解决开发语言中的两个浮点数相加1. 各开发语言2. 产生原因3. 解决方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部