在银行之类的企业里面,会遇到很多数字,特别是小数,对于小数精度的保留是许多程序员要注意的事情。
常见的c# 处理小数位数如下:Math.Round(0.333333,2);//按照四舍五入的国际标准
double dbdata=0.335333;
 string str1=String.Format("{0:F}",dbdata);//默认为保留两位decimal.Round(decimal.Parse("0.3333333"),2)private System.Globalization.NumberFormatInfo nfi = new System.Globalization.NumberFormatInfo();    float test=0.333333f;
    nfi.NumberDecimalDigits=2;
    string result=test.ToString("N", nfi);    string result= String.Format("{0:N2}",Convert.ToDecimal("0.333333").ToString());// 这是个保留两位小数并加千分位符号的方法Convert.ToDouble(DataBinder.Eval(dbr, "入账学杂费")).ToString("n");现有要求如下,确定了精度(如 0.001),对数字做不同的处理1.正数,如12.1111,则需转换为12.112,而12.11则仍为12.11,即按精度截取,但不是四舍五入,而是如果是正数则进12.附属,如-12.1111,则需转换为-12.111,即如果为负数,则去掉我的想法:1.将数字转换为字符串类型,获取小数的位数,如0.01则小数位数为22.根据位数判断,如果要转换的数的小数位数小于等于精度的小数位数,则无需转换(也无需判断正负)3.如果 要转换的数的小数位数大于精度的小数位数,则需转换并需判断正负4. 如果为正数,将要转换的数与精度(必须为0.01类似的形式)相加并截取精度的小数位数的字符串5.如果为负数,直接截取下面是我的代码:
http://files.cnblogs.com/alexis/AccuracyConvert.rar 我知道这样做肯定会存在很多问题,例如在数字转换字符串时候精度丢失之类的问题,但只是目前我的想法,希望大虾们教我下,什么方法更好,更方便(我已经在博客园发表了,现在抄过来,嘿嘿)

解决方案 »

  1.   

    判断正负
    利用 substring+indexof 来实现
      

  2.   

    C#的四舍五入我也很少用, 几乎都是自己实现 public double MyRound(double value, int digit) 
      { 
        double temp1 = Math.Pow(10, digit); 
        double temp2 = value * temp1; 
        
        temp2 +=0.5;
        return (Math.Floor(temp2) / temp1);
      }  
      

  3.   

    这两个参考资料,可以看看!
    Financial calculation using .NET Part 1 
    http://www.codeproject.com/KB/aspnet/FinanceCalculation/3.jpgFinancial Calculation using .NET:- Depreciation Part-2
      

  4.   

    还有这一篇文章!Financial Calculations in C#
      

  5.   

    原本方法挺好的。转字符串实现Round比较复杂了。还要赚回来。何必呢。数值操作多方便。
      

  6.   

    这是我写的方法
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;namespace AccuracyConvert
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        /// <summary>
            /// 精度兑换
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnConvert_Click(object sender, EventArgs e)
            {
                //validate ,省略
                
                //精度
                double accuracy = double.Parse(txtAccuracy.Text.ToString());
                //收支类型
                double money = double.Parse(txtMoney.Text.ToString());            //MessageBox.Show(GetLength(money).ToString());
                
                txtConvertedMoney.Text = Convert(accuracy, money) ;
       
            }        /// <summary>
            /// 精度转换
            /// </summary>
            /// <param name="accuracy"></param>
            /// <param name="money"></param>
            /// <returns></returns>
            private string Convert(double accuracy,double money )
            {
                string result="";
                
                //精度小,如accuracy:0.1而money为12,此时不需转换
                if (GetLength(money) < GetLength(accuracy))
                {
                    result = money.ToString();
                }
                else
                {
                    int length = GetLength(accuracy);//精度长度                System.Globalization.NumberFormatInfo provider = new System.Globalization.NumberFormatInfo();
                    provider.NumberDecimalDigits = length; //要设定的小数位数                if (money > 0)//收入,if 0.01, 12.321==>12.33
                    {
                        result = (money+accuracy).ToString("N", provider); //再利用ToString函数格式化小数位数 
                    }
                    else//支出, if 0.01, -12.321==>12.32
                    {
                        result = money.ToString("N", provider); //再利用ToString函数格式化小数位数 
                    }
                }
                return result;
            }        /// <summary>
            /// 获取小数的长度
            /// </summary>
            /// <param name="number"></param>
            /// <returns></returns>
            private int GetLength(double number)
            {
                string tempString = number.ToString();
                if (tempString.LastIndexOf('.') > 0)
                {
                    return tempString.Substring(tempString.LastIndexOf('.') + 1).Length;
                }
                else
                {
                    return 0;
                }
               
            }
        }
    }
      

  7.   

    可能上面说的不是很明白:
    要求如下,确定了精度(如 0.001),对数字做不同的处理
    1.正数,如12.1111,则需转换为12.112,而12.11则仍为12.11,即按精度截取,但不是四舍五入,而是如果是正数则进12.负数,如-12.1111,则需转换为-12.111,即如果为负数,则去掉我的想法:
    1.将数字转换为字符串类型,获取小数的位数,如0.01则小数位数为2
    2. 根据位数判断,如果要转换的数的小数位数小于等于精度的小数位数,则无需转换(也无需判断正负)
    3.如果 要转换的数的小数位数大于精度的小数位数,则需转换并需判断正负
    4. 如果为正数,将要转换的数与精度(必须为0.01类似的形式)相加并截取精度的小数位数的字符串
    5.如果为负数,直接截取下面是我的代码:
    http://files.cnblogs.com/alexis/AccuracyConvert.rar
      

  8.   

    呵呵,银行的不吃亏算法,零头多算点就是了
    int precision = 3;
    double value = -12.1111;
    value = Math.Ceiling(value * Math.Pow(10, precision)) / Math.Pow(10, precision);