我有从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
答案 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.
结果是:只需将60M
或60.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;