浮点数(有限浮点数、无限循环浮点数)的精确表达

  在计算机中,是否decimal或者float或者double来存储小数是不能得到精确值得。如果你希望能得到精确的计算结果,最好是用分数形式来表示小数。有限小数或者无限循环小数都可以转化为分数。

  例如:

  0.9=9/10

  0.333(3)=1/3

 给定一个小数,它的形式为0.34、0.30、0.33(33)、.....形如这些的小数把它们转化成分数形式(最简分数)。

首先我们先定义一个分数类和小数类

 1  /// <summary>
 2     /// 分数类
 3     /// </summary>
 4     public class Fraction
 5     {
 6         /// <summary>
 7         /// 是否是正数
 8         /// </summary>
 9         private bool _isPlus = false;
10         /// <summary>
11         /// 是否是正数
12         /// </summary>
13         public bool IsPlus
14         {
15             get { return _isPlus; }
16             set { _isPlus = value; }
17         }
18
19         /// <summary>
20         /// 分子
21         /// </summary>
22         private Int64 _molecule;
23         /// <summary>
24         /// 分子
25         /// </summary>
26         public Int64 Molecule
27         {
28             get { return _molecule; }
29             set { _molecule = value; }
30         }
31
32         /// <summary>
33         /// 分母
34         /// </summary>
35         private Int64 _denominator;
36         /// <summary>
37         /// 分母
38         /// </summary>
39         public Int64 Denominator
40         {
41             get { return _denominator; }
42             set
43             {
44                 if (value != 0)
45                     _denominator = value;
46                 else
47                 {
48                     throw new Exception("分母不能为零");
49                 }
50             }
51         }
52
53         public Fraction() { }
54         public Fraction(int molecule, int denominator)
55         {
56             this._denominator = denominator;
57             this._molecule = molecule;
58         }
59
60         public void Show()
61         {
62             if (this._isPlus)
63                 Console.WriteLine("分数为:{0}/{1}", this._molecule, this._denominator);
64             else
65                 Console.WriteLine("分数为:-{0}/{1}", this._molecule, this._denominator);
66         }
67
68
69
70
71     }
 1 /// <summary>
 2     /// 浮点数类
 3     /// </summary>
 4     public class Decimals
 5     {
 6         /// <summary>
 7         /// 是否是整数
 8         /// </summary>
 9         private bool _isPlus = false;
10         /// <summary>
11         /// 是否是整数
12         /// </summary>
13         public bool IsPlus
14         {
15             get { return _isPlus; }
16             set { _isPlus = value; }
17         }
18
19
20         /// <summary>
21         /// 整数部分
22         /// </summary>
23         private Int64 _integer;
24         /// <summary>
25         /// 整数部分
26         /// </summary>
27         public Int64 Integer { get { return _integer; } set { _integer = value; } }
28
29         /// <summary>
30         /// 小数部分
31         /// </summary>
32         private Int64 _double;
33         /// <summary>
34         /// 小数部分
35         /// </summary>
36         public Int64 Dobule { get { return _double; } set { _double = value; } }
37
38         /// <summary>
39         /// 循环部分
40         /// </summary>
41         public Int64 _loop;
42         /// <summary>
43         /// 循环部分
44         /// </summary>
45         public Int64 Loop { get { return _loop; } set { _loop = value; } }
46
47         /// <summary>
48         /// 循环部分
49         /// </summary>
50         public bool _isLoop = false;
51         /// <summary>
52         /// 循环部分
53         /// </summary>
54         public bool IsLoop
55         {
56             get { return _isLoop; }
57             set { _isLoop = value; }
58         }
59
60         /// <summary>
61         /// 循环浮点数
62         /// </summary>
63         /// <param name="integer"></param>
64         /// <param name="doubles"></param>
65         /// <param name="loop"></param>
66         public Decimals(Int64 integer, Int64 doubles, Int64 loop)
67         {
68             this._integer = integer;
69             this._double = doubles;
70             this._loop = loop;
71             this.IsLoop = true;
72         }
73
74         /// <summary>
75         /// 有限浮点数
76         /// </summary>
77         /// <param name="integer"></param>
78         /// <param name="doubles"></param>
79         public Decimals(Int64 integer, Int64 doubles)
80         {
81             this._integer = integer;
82             this._double = doubles;
83             this.IsLoop = false;
84         }
85
86
87         public Decimals() { }
88
89     }

判断输入的浮点数是否合法

 /// <summary>
        /// 验证是否为满足要求的浮点数
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        static bool IsDouble(string number)
        {
            string[] regexArray = { @"^[1-9]\d*\.\d*(\d*|\(\d+\))$" ,
                                  @"^0\.\d*(\d*|\(\d+\))$",
                                  @"^-[1-9]\d*\.\d*(\d*|\(\d+\))$",
                                  @"^-0\.\d*(\d*|\(\d+\))$"};

            bool isResult = false;
            foreach (string regexString in regexArray)
            {
                Regex regex = new Regex(regexString);

                if (regex.IsMatch(number))
                {
                    isResult = true;
                    break;
                }
            }
            return isResult;
        }

验证是否是循环浮点数

 /// <summary>
        /// 是否为循环浮点数
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        static bool IsLoopDecimal(string number)
        {

            string[] regexArray = { @"^[1-9]\d*\.\d*\(\d+\)$" ,
                                  @"^0\.\d*\(\d+\)$",
                                  @"^-[1-9]\d*\.\d*\(\d+\)$",
                                  @"^-0\.\d*\(\d+\)$"};
            bool isReuslt = false;
            foreach(string regexString in regexArray)
            {
                Regex regex = new Regex(regexString);
                if (regex.IsMatch(number))
                {
                    isReuslt = true;
                    break;
                }
            }

            return isReuslt;
        }

判断是否是正数

 /// <summary>
        /// 判断整数还是正数
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        static bool IsPlus(string number)
        {
            string[] regexArray = {  @"^[1-9]\d*\.\d*(\d*|\(\d+\))$",
                                  @"^0\.\d*(\d*|\(\d+\))$"};

            bool isResult = false;
            foreach (string regexString in regexArray)
            {
                Regex regex = new Regex(regexString);

                if (regex.IsMatch(number))
                {
                    isResult = true;
                    break;
                }
            }
            return isResult;
        }

把输入数据转化为浮点数对象

 /// <summary>
        /// 把输入数据转化为浮点数对象
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>

        static Decimals GetDecimals(string number)
        {
            Decimals decimals = null;

            if (IsLoopDecimal(number))
            {
                #region 循环小数分解部分
                decimals = new Decimals();
                decimals.IsLoop = true;
                Regex regexLoop = new Regex(@"^[1-9]\d*\.");//\(\d+\)
                string value = regexLoop.Match(number).Groups[0].Value;
                if (!string.IsNullOrEmpty(value))
                    decimals.Integer = Convert.ToInt64((value.TrimEnd(‘.‘)));
                else
                {
                    decimals.Integer = 0;
                }

                value = "";
                regexLoop = new Regex(@"\(\d+\)");
                value = regexLoop.Match(number).Groups[0].Value;
                if (!string.IsNullOrEmpty(value))
                    decimals.Loop = Convert.ToInt64(value.TrimStart(‘(‘).TrimEnd(‘)‘));

                value = "";
                regexLoop = new Regex(@"\.\d*\(");
                value = regexLoop.Match(number).Groups[0].Value;
                if (!string.IsNullOrEmpty(value))
                    decimals.Dobule = Convert.ToInt64(value.TrimStart(‘.‘).TrimEnd(‘(‘));
                else
                    decimals.Dobule = 0;
                #endregion

            }
            else
            {
                #region 有限小数分解部分
                decimals = new Decimals();
                decimals.IsLoop = false;
                Regex regexLoop = new Regex(@"^[1-9]\d*\.");//\(\d+\)
                string value = regexLoop.Match(number).Groups[0].Value;
                if (!string.IsNullOrEmpty(value))
                    decimals.Integer = Convert.ToInt64((value.TrimEnd(‘.‘)));
                else
                    decimals.Integer = 0;

                value = "";
                regexLoop = new Regex(@"\.\d*$");
                value = regexLoop.Match(number).Groups[0].Value;
                if (!string.IsNullOrEmpty(value))
                    decimals.Dobule = Convert.ToInt64(value.TrimStart(‘.‘));
                else
                    decimals.Dobule = 0;
                #endregion
            }

            if (IsPlus(number))
                decimals.IsPlus = true;
            else
                decimals.IsPlus = false;

            return decimals;
        }

求最大公约数

  /// <summary>
        /// 求最大公约数
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns></returns>
        static Int64 GetGCD(Int64 x, Int64 y)
        {
            if (x < y)
                return GetGCD(y, x);       if  (y == 0)                throw new Exception("0没有最大公约数");
            if (x == y)
                return y;
            else
                return GetGCD(y, x - y);
        }

测试调用

 static void Main(string[] args)
        {
            while (true)
            {

                Console.Write("请输入浮点数(有限小数或者无限循环小数),例如:0.12、0.23(121) :");

                string inputNumber = Console.ReadLine();
                if (IsDouble(inputNumber))
                {
                    Decimals decimals = GetDecimals(inputNumber);
                    Fraction Fraction = GetFraction(decimals);
                    Fraction.Show();
                }
                else
                {
                    Console.WriteLine("输入格式不正确");
                }
                Console.ReadLine();
            }

        }
时间: 2024-08-15 18:50:03

浮点数(有限浮点数、无限循环浮点数)的精确表达的相关文章

IOS开发系列--无限循环的图片浏览器

--UIKit之UIScrollView 概述 UIKit框架中有大量的控件供开发者使用,在iOS开发中不仅可以直接使用这些控件还可以在这些控件的基础上进行扩展打造自己的控件.在这个系列中如果每个控件都介绍一遍确实没有必要,所谓授人以鱼不如授人以渔,这里会尽可能让大家明白其中的原理,找一些典型的控件进行说明,这样一来大家就可以触类旁通.今天我们主要来看一下UIScrollView的内容: UIView UIScrollView 实战--图片浏览器 UIView 在熟悉UIScrollView之前

renderer_outline_aa::line3()无限循环

情况一: 在该函数出现无限循环在如下两句代码: while(abs(sx - lp.x1) + abs(sy - lp.y1) > lp2.len){sx = (lp.x1 + sx) >> 1;sy = (lp.y1 + sy) >> 1;} 断点调试的时候,出现无限循环的结果是因为取值出现如下的问题: sx=0x3d00lp.x1=0x3d01sy=0x7a00lp.y1=0x7a01lp2.len=1 在这种情况下,sx和sy的值永远不变,并且循环的条件永远成立(whi

自定义 ViewGroup 支持无限循环翻页之三(响应回调事件)

大家如果喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处,再次感谢 ####################################################################### 自定义 ViewGroup 支持无限循环翻页系列 自定义 ViewGroup 支持无限循环翻页之一(重写 onLayout以及 dispatchDraw) 自定义 ViewGroup 支持无限循环翻页之二(处理触摸事件)

Ubuntu中输入startx并重启后登录界面无限循环问题

今天,在学习了编程两个多月后遇到的第一个菜鸟技术问题,解决后有一种兴奋和迷茫. 言归正传,说说遇到的问题和解决方案. 在Ubuntu14.04中,按照linux的传统做法(基于redhat),在root下输入了startx并enter,结果出现了一个没有任何图标的界面,没有任何命令可以输入,于是选择重启,那么问题来了. 重启后进入登录界面,但是正确输入密码后还是输入密码的无限循环,纠结...Google.百度后发现原来有好多菜鸟也有同样的问题,于是对此问题进行了探讨学习. 先说解决方案: (1)

(原创)c#学习笔记04--流程控制04--循环04--循环中断和无限循环

4.4.4  循环的中断 有时需要更精细地控制循环代码的处理.C#为此提供了4个命令,其中的3个已经在其他情形中介绍过了:?  break——立即终止循环.?  continue——立即终止当前的循环(继续执行下一次循环).?  goto——可以跳出循环,到已标记好的位置上(如果希望代码易于阅读和理解,最好不要使用该命令).?  return——跳出循环及其包含的函数(参见第6章).?  break命令可退出循环,继续执行循环后面的第一行代码 4.4.5  无限循环 可以通过编写错误代码或错误的

UIScrollView实现图片轮播器及其无限循环效果

图片轮播器: 一.实现效果 实现图片的自动轮播            二.实现代码 storyboard中布局 代码: 1 #import "YYViewController.h" 2 3 @interface YYViewController () <UIScrollViewDelegate> 4 @property (weak, nonatomic) IBOutlet UIScrollView *scrollview; 5 /** 6 * 页码 7 */ 8 @prop

【Android】ViewPager实现无限循环滚动

最近做的一个项目,客户要求在ViewPager实现的主页面中滑动到最后一页后继续滑动能返回到第一页,也就是实现无限循环滚动,效果如下: 看了下ViewPager没有滑到尽头的回调方法,因此想到的解决方案是,在原来的最后一页之后再加上一个第一页,也就是原本有编号为a1,b,c的三个页面,现在在最后面再加一个a页面,变为a1.b.c.a2四个页面,然后使用OnPageChangeListener中的onPageSelected方法来监听到页面切换,当发现是从第三个页面(c)切换到第四个页面(a1)时

viewpager 自动无限循环 这段代码移到你的程序中就可以用了

本程序需要懂得viewpager的基础知识,也就是说你能够自己写出一个手动滑动的viewpager,下面我将附带加小圆点的知识 那么我们回顾一下图片轮转的基础知识,如果你已经对viewpager很熟悉了就不用看了,浪费时间 1.viewpager是在v4兼容报里面的,使用控件时请带上报名 2.数据来源用list存放,我这里用的是textview做的小圆点list<textview>,layout做的单张幻灯片list<view>,将xml文件inflate成为view,View.i

Unity UGUI —— 无限循环List

还记得大学毕业刚工作的时候是做flash的开发,那时候看到别人写的各种各样的UI组件就非常佩服,后来自己也慢慢尝试着写,发现其实也就那么回事.UI的开发其实技术的成分相对来说不算多,但是一个好的UI是绝对少不了底层组件的支持的.我个人认为UI组件中相对比较复杂的就是List了,所以,这两天实现了一个UGUI的list,写了好几个版本,最终这个版本是相对比较好用的,在这我介绍一下大概思路,一是巩固一下知识做个记录,二是发扬一下分享精神.嘿嘿,大家多多赐教. 写List有两个重点是需要考虑的: 1.