C++中double值的处理

近日看见了一张来自网上的图

父亲看见这图就觉得十分有意思,就给许多村里的大学生们看让他们算,如图这是一道并不难的三元一次方程组问题,我心里一盘算觉得正常算并不能体现我IT精英的与众不同,于是我就说看我变个程序来解题。结果当然遵循装B遭雷劈的至高真理。

这道题目的答案是3.5,4.5,9.5和3.5。

为了尽快解决问题我就是用了最简单的逻辑方法让计算机用大量的运算去堆答案代码如下

 1 #include<iostream>
 2 using namespace std;
 3 void main()
 4 {
 5     double a, b, c;
 6         for (a = 0; a <= 10; a += 0.1)
 7         {
 8             for (b = 0; b <= 10; b += 0.1)
 9             {
10                 for (c = 0; c <= 10; c += 0.1)
11                 {
12                     if (a + b == 8 && c - a == 6 && a + c == 13)
13                     {
14                         cout << a << b << c;
15                     }
16                 }
17             }
18         }
19         system("pause");
20 }

按照如图的逻辑似乎没有任何问题然而运行却并不能得到结果我百思不得其解于是就一步一步地调试去看每次循环各变量的值

可以看到上图中所有变量的值都不是我们真正设定的值,他们是无限接近的近似值所以并不存在满足判断条件的a,b,c的值

我也就没能得到答案,而我又不死心的再次去尝试,发现如果我把初始值设为3.4,4.4,9.4,即只循环一次就可以得到正确结果

然后就成功的输出了

这就很尴尬了据我大一新生的揣测,我觉得是因为double类型是以二进制存储数据显然产生无限接近设定值的实际值的原因是遇到了二进制除不尽的值,如3.3所以在第一幅图中因为设定的初始值是3.3 所以从一开始就是一个注定不能得到小数点后一位的值所以运算失败,而第二次我们把初值改为了3.4于是得到了正常的小数,所以经过一次+0.1计算后便得到了符合条件的值。成功得到了答案(注意这里0.1也是默认为double类型的值所以如果你累加的是0.3,那么仍然的不到想要的准确值)。

因为C++只是在学校老师教了一点所以我并没有继续研究如何解决这操蛋的问题,幸好我还自学了C#想到了C#中的十进制类型decimal于是我又用C#写了一遍

 1 using System;
 2 namespace 计算
 3 {
 4     class Program
 5     {
 6         static void Main(string[] args)
 7         {
 8             decimal a, b, c;
 9             for(a=0m; a <= 10m; a+=0.1m)
10             {
11                 for (b = 0m; b<= 10m; b+=0.1m)
12                 {
13                     for (c = 0m; c <= 10m; c+=0.1m)
14                     {
15                         if (a+b == 8m && c-a == 6m&&a+c==13m)
16                         {
17                             Console.WriteLine("a={0},b={1},c={2}", a, b,c);
18                         }
19                     }
20                 }
21             }
22             Console.ReadKey();
23         }
24     }
25 }

妥妥的十进制,爽。

大一刚读完有什么不对的地方多多指教

时间: 2024-10-06 00:28:54

C++中double值的处理的相关文章

C#中double值的精度问题

在开发的时候,遇到一个问题,c#中定义一个double变量,当这个变量在很大的时候,让这个变量加上或者减去一个较小的值不会改变其大小(这个其实与double变量的二进制存储机制相关),就是说加上一个值之后的值.comPareTo(原来的值)返回0,就是说他们相等. 于是我想找到哪个具体的值是在加上或者减去1时,值的改变可以被检测到的.于是有了以下代码. //因为相当大的范围内都是可以检测到大小改变的,所以不从1开始,节约时间 double a = 10000000; double pre_a =

将258.369 double值转为内存表示(科学计数法)

前言 庖丁解牛 - <<庄子>> 庖丁为文惠君解牛,手之所触, 肩之所倚, 足之所履, 膝之所踦, 砉然向然, 奏刀騞然, 莫不中音, 合于<桑林>之舞, 乃中<经首>之会. 文惠君曰:"嘻, 善哉! 技盍至此乎?" 庖丁释刀对曰:"臣之所好者, 道也, 进乎技矣.始臣之解牛之时, 所见无非牛者.三年之后, 未尝见全牛也.方今之时, 臣以神遇而不以目视, 官知止而神欲行.依乎天理, 批大郤, 导大窾, 因其固然, 技经肯綮之未尝

C# 中的值类型和引用类型

原文 C# 中的值类型和引用类型 值类型(value type):int,long,float,double,decimal,char,bool 和 struct 统称为值类型.值类型变量声明后,不管是否已经赋值,编译器为其分配内存. 引用类型(reference type):string 和 class统称为引用类型.当声明一个类时,只在栈中分配一小片内存用于容纳一个地址,而此时并没有为其分配堆上的内存空间.当使用 new 创建一个类的实例时,分配堆上的空间,并把堆上空间的地址保存到栈上分配的

swift中Double转String

swift上手有好几天了.发现swift除了本身的几个基本类型转换,一些比较特殊的数值类型转换需要“桥接”到Objective-C来进行- 代码当然也很简单- var numString = "1.0" var numDouble:Double numDouble = String.bridgeToObjectiveC(numString)().doubleValue //相当于objective-c的" numdouble = [numString doubleValue]

c++中double转换成string型(浮点数的格式化)

在日常编程中--包括对话框.关系数据库.金融程序.SMS程序及一切处理数据文件的程序,需要控制小数点后的小数位的情况非常普遍,本文中将要讲 解如何用简单的方法来控制小数位,另外,还要揭开字符串及数据精度的一点点小秘密. 问题的引出 如有一个函数,其可接受一个long double参数,并将参数转换为字符串,结果字符串应保留两位小数,例如,浮点值123.45678应该生成“123.45”这样的字符串.表面上看来 这是一个意义不大的编程问题,然而,如果真要在实际中派上用场,函数应设计为具有一定弹性,

MVC框架中的值提供(一)

在MVC框架中action方法中的Model数据的绑定的来源有很多个,可能是http请求中的get参数或是post提交的表单数据,会是json字符串或是路径中的相关数据;MVC框架中针对这些不同的数据来源抽象了IValueProvider接口; public interface IValueProvider { bool ContainsPrefix(string prefix); ValueProviderResult GetValue(string key); } IValueProvide

struts2 jsp表单提交后保留表单中输入框中的值 下拉框select与input

原文地址:struts2 jsp表单提交后保留表单中输入框中的值 下拉框select与input jsp页面 1     function dosearch() {2         if ($("#textValue").val() == "") {3                 $("#errortip").html("<font color='#FF0000'>请输入查询内容</font>")

Strut2 ognl取出存放在request,session,application和对象栈的中的值

1.取出request,session,applicaiton中的值 a.往里面加入request,session,application中加入值 public String testServlet(){ ServletActionContext.getRequest().setAttribute("request_username", "username"); ActionContext.getContext().getSession().put("se

jsp页面通过使用s标签获取值栈中的值(初识)

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitio