栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/326228.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号