将double转换为十进制

时间:2010-07-14 09:56:44

标签: c# decimal

我有从double到decimal的转换问题:

 public class CartesianCoordinates
    {
        public int LatitudeHours { get; set;}
        public int LatitudeMinutes { get; set; }
        public int LatitudeSeconds { get; set; }
        public GeoDirectionLongtitude LongitudeDirection { get; set; }

        public int LongitudeHours { get; set; }
        public int LongitudeMinutes { get; set; }
        public int LongitudeSeconds { get; set; }
        public GeoDirectionLatitude LatitudeDirection { get; set; }
    }

public class DecimalCoordinates
    {
        public decimal Latitude { get; set; }
        public decimal Longitude { get; set; }
    }

CartesianCoordinates CartesianCoordinates=new CartesianCoordinates(){LatitudeHours =12,LatitudeMinutes =34,LatitudeSeconds=56 }

     converterDecimalCoordinates.Latitude = CartesianCoordinates.LatitudeHours + (CartesianCoordinates.LatitudeMinutes + (CartesianCoordinates.LatitudeSeconds / 60)) / 60;

为什么我得到12?我想要12,55

5 个答案:

答案 0 :(得分:9)

你的所有计算都是整数,并且是四舍五入的(更准确地说,是截断的)。尝试使用60m替换60的文字值以强制进行小数计算,或者60.0强制进行双重计算(在这种情况下,您需要在结尾处转换为小数)。

答案 1 :(得分:7)

Int32 x = 10;

Decimal y = x / 4;  // Performs an integer devision - result is 2.0
Decimal z = x / 4M; // Performs a decimal devision - result is 2.25

如果两个操作数都是整数,则会得到整数分割。通过将后缀M添加到一个数字,您可以明确声明该数字应该被解释为十进制数,因此您将获得十进制数。

答案 2 :(得分:3)

你得到12因为计算在某些部分的int类型上运行,因此无法包含精度 - 该值被截断为int。我会在计算之前将您的所有值转换为小数 - 或者正如其他答案所建议的那样,将您的文字指定为十进制数。

更新:正如其他帖子所强调的那样,目前正在执行整数除法 - 我不知道技术术语,所以和你一样,我今天学到了什么lol

答案 3 :(得分:3)

作为我与David M和DanielBrücknerunder this answer的讨论的副产品以及我自己在this answer by Adam下的部分错误陈述,很明显,很遗憾,所有答案都只是部分正确。发生了什么事:

// example (all  x, y, z ar ints):
Decimal d = x + y + z / 60M;

// is left to right evaluated as
Decimal d = x + y + (((Decimal) z) / 60M);

// when doing addition, this is what happens when you add integers and something else:
Decimal d = x + y + (int) (((Decimal) z) / 60M);

// which will yield a truncated result.

结果是:只需将60M60.0添加到整个语句({3}},就不会(或可能不会)产生所需结果,具体取决于执行顺序声明和/或存在加法/减法的情况,如OP的问题中的情况。

要解决此问题,请遵循Adam的建议并将每个加/减步骤转换为小数,一直使用小数(不是很清楚)或将计算放在一个以小数为参数的小函数中,强制隐式转换:

Decimal GetDecimalLatitude(Decimal latitudeHours, Decimal latitudeMinutes, Decimal latitudeSeconds)
{
    return latitudeHours + (latitudeMinutes + (latitudeSeconds / 60)) / 60;
}

作为奖励,它更短,增加了可读性。请使用以下语句调用此方法:

converterDecimalCoordinates.Latitude = GetDecimalLatitude(
    CartesianCoordinates.LatitudeHours, 
    CartesianCoordinates.LatitudeMinutes,
    CartesianCoordinates.LatitudeSeconds);

答案 4 :(得分:1)

正如其他人已经提到的那样,你所在分区的两边都有一个整数。因此结果也是一个整数(然后将隐式转换为左侧的小数)。要解决这个问题,你的除法的一边必须是一个小数,导致进行十进制除法。所以只需尝试以下代码:

converterDecimalCoordinates.Latitude = CartesianCoordinates.LatitudeHours + (CartesianCoordinates.LatitudeMinutes + (CartesianCoordinates.LatitudeSeconds / 60)) / (decimal)60;