Index: binaries/data/mods/public/gui/common/tooltips.js
===================================================================
--- binaries/data/mods/public/gui/common/tooltips.js	(revision 18512)
+++ binaries/data/mods/public/gui/common/tooltips.js	(working copy)
@@ -298,11 +298,11 @@ function getBuildRateTooltip(template)
  */
 function multiplyEntityCosts(template, trainNum)
 {
 	let totalCosts = {};
 	for (let r in template.cost)
-		totalCosts[r] = Math.floor(template.cost[r] * trainNum);
+		totalCosts[r] = Math.round(template.cost[r] * trainNum);
 
 	return totalCosts;
 }
 
 /**
@@ -313,11 +313,11 @@ function getEntityCostComponentsTooltipS
 	if (!trainNum)
 		trainNum = 1;
 
 	let totalCosts = multiplyEntityCosts(template, trainNum);
 	if (template.cost.time)
-		totalCosts.time = Math.ceil(template.cost.time * (entity ? Engine.GuiInterfaceCall("GetBatchTime", { "entity": entity, "batchSize": trainNum }) : 1));
+		totalCosts.time = Math.round(template.cost.time * (entity ? Engine.GuiInterfaceCall("GetBatchTime", { "entity": entity, "batchSize": trainNum }) : 1));
 
 	let costs = [];
 	for (let type in template.cost)
 		// Population bonus is shown in the tooltip
 		if (type != "populationBonus" && totalCosts[type])
@@ -386,12 +386,12 @@ function getWallPieceTooltip(wallTypes)
 		for (let resource in resourceCount)
 			// Translation: This string is part of the resources cost string on
 			// the tooltip for wall structures.
 			out.push(sprintf(translate("%(resourceIcon)s %(minimum)s to %(resourceIcon)s %(maximum)s"), {
 				"resourceIcon": costIcon(resource),
-				"minimum": Math.min.apply(Math, resourceCount[resource]),
-				"maximum": Math.max.apply(Math, resourceCount[resource])
+				"minimum": Math.round(Math.min(...resourceCount[resource])),
+				"maximum": Math.round(Math.max(...resourceCount[resource]))
 			}));
 	else
 		for (let i = 0; i < wallTypes.length; ++i)
 			out.push(getEntityCostComponentsTooltipString(wallTypes[i]).join(", "));
 
Index: binaries/data/mods/public/gui/session/selection_details.js
===================================================================
--- binaries/data/mods/public/gui/session/selection_details.js	(revision 18512)
+++ binaries/data/mods/public/gui/session/selection_details.js	(working copy)
@@ -49,12 +49,12 @@ function updateGarrisionHealthBar(entSta
 		let healthSize = healthBarGarrison.size;
 		healthSize.rtop = 100-100*Math.max(0, Math.min(1, totalGarrisionHealth / maxGarrisionHealth));
 		healthBarGarrison.size = healthSize;
 		healthGarrison.tooltip = sprintf(translate("%(label)s %(current)s / %(max)s"), {
 			"label": "[font=\"sans-bold-13\"]" + translate("Hitpoints:") + "[/font]",
-			"current": Math.ceil(totalGarrisionHealth),
-			"max": Math.ceil(maxGarrisionHealth)
+			"current": Math.round(totalGarrisionHealth) || 1,
+			"max": Math.round(maxGarrisionHealth) || 1
 		});
 	}
 }
 
 // Fills out information that most entities have
@@ -106,19 +106,19 @@ function displaySingle(entState)
 		if (entState.foundation && entState.visibility == "visible" && entState.foundation.numBuilders !== 0)
 		{
 			// logic comes from Foundation component.
 			let speed = Math.pow(entState.foundation.numBuilders, 0.7);
 			let timeLeft = (1.0 - entState.foundation.progress / 100.0) * template.cost.time;
-			let timeToCompletion = Math.ceil(timeLeft/speed);
+			let timeToCompletion = Math.round(timeLeft/speed) || 1;
 			Engine.GetGUIObjectByName("health").tooltip = sprintf(translatePlural("This foundation will be completed in %(seconds)s second.", "This foundation will be completed in %(seconds)s seconds.", timeToCompletion), { "seconds": timeToCompletion });
 		}
 		else
 			Engine.GetGUIObjectByName("health").tooltip = "";
 
 		Engine.GetGUIObjectByName("healthStats").caption = sprintf(translate("%(hitpoints)s / %(maxHitpoints)s"), {
-			"hitpoints": Math.ceil(entState.hitpoints),
-			"maxHitpoints": Math.ceil(entState.maxHitpoints)
+			"hitpoints": Math.round(entState.hitpoints) || 1,
+			"maxHitpoints": Math.round(entState.maxHitpoints) || 1
 		});
 	}
 
 	// CapturePoints
 	Engine.GetGUIObjectByName("captureSection").hidden = !entState.capturePoints;
@@ -143,12 +143,12 @@ function displaySingle(entState)
 		for (let i in entState.capturePoints)
 			if (i != entState.player)
 				size = setCaptureBarPart(i, size);
 
 		Engine.GetGUIObjectByName("captureStats").caption = sprintf(translate("%(capturePoints)s / %(maxCapturePoints)s"), {
-			"capturePoints": Math.ceil(entState.capturePoints[entState.player]),
-			"maxCapturePoints": Math.ceil(entState.maxCapturePoints)
+			"capturePoints": Math.round(entState.capturePoints[entState.player]) || 1,
+			"maxCapturePoints": Math.round(entState.maxCapturePoints) || 1
 		});
 	}
 
 	// Experience
 	Engine.GetGUIObjectByName("experience").hidden = !entState.promotion;
@@ -176,11 +176,11 @@ function displaySingle(entState)
 	Engine.GetGUIObjectByName("resourceSection").hidden = !entState.resourceSupply;
 	if (entState.resourceSupply)
 	{
 		let resources = entState.resourceSupply.isInfinite ? translate("∞") :  // Infinity symbol
 			sprintf(translate("%(amount)s / %(max)s"), {
-				"amount": Math.ceil(+entState.resourceSupply.amount),
+				"amount": Math.round(+entState.resourceSupply.amount) || 1,
 				"max": entState.resourceSupply.max
 			});
 
 		let resourceType = getResourceTypeDisplayName(entState.resourceSupply.type);
 
@@ -234,11 +234,11 @@ function displaySingle(entState)
 		Engine.GetGUIObjectByName("resourceCarryingText").caption = entState.foundation.numBuilders + "    ";
 		if (entState.foundation.numBuilders !== 0)
 		{
 			let speedup = Math.pow((entState.foundation.numBuilders+1)/entState.foundation.numBuilders, 0.7);
 			let timeLeft = (1.0 - entState.foundation.progress / 100.0) * template.cost.time;
-			let timeSpeedup = Math.ceil(timeLeft - timeLeft/speedup);
+			let timeSpeedup = Math.round(timeLeft - timeLeft/speedup) || 1;
 			Engine.GetGUIObjectByName("resourceCarryingIcon").tooltip = sprintf(translatePlural("Number of builders.\nTasking another to this foundation would speed construction up by %(speedup)s second.", "Number of builders.\nTasking another to this foundation would speed construction up by %(speedup)s seconds.", timeSpeedup), { "speedup": timeSpeedup });
 		}
 		else
 			Engine.GetGUIObjectByName("resourceCarryingIcon").tooltip = translate("Number of builders.");
 	}
@@ -353,12 +353,12 @@ function displayMultiple(selection)
 		healthSize.rtop = 100-100*Math.max(0, Math.min(1, averageHealth / maxHealth));
 		unitHealthBar.size = healthSize;
 
 		Engine.GetGUIObjectByName("healthMultiple").tooltip = sprintf(translate("%(label)s %(current)s / %(max)s"), {
 			"label": "[font=\"sans-bold-13\"]" + translate("Hitpoints:") + "[/font]",
-			"current": Math.ceil(averageHealth),
-			"max": Math.ceil(maxHealth)
+			"current": Math.round(averageHealth) || 1,
+			"max": Math.round(maxHealth) || 1
 		});
 	}
 
 	Engine.GetGUIObjectByName("captureMultiple").hidden = maxCapturePoints <= 0;
 	if (maxCapturePoints > 0)
@@ -385,12 +385,12 @@ function displayMultiple(selection)
 		// last handle the owner's points, to keep those points on the bottom for clarity
 		setCaptureBarPart(playerID, size);
 
 		Engine.GetGUIObjectByName("captureMultiple").tooltip = sprintf(translate("%(label)s %(current)s / %(max)s"), {
 			"label": "[font=\"sans-bold-13\"]" + translate("Capture points:") + "[/font]",
-			"current": Math.ceil(capturePoints[playerID]),
-			"max": Math.ceil(maxCapturePoints)
+			"current": Math.round(capturePoints[playerID]) || 1,
+			"max": Math.round(maxCapturePoints) || 1
 		});
 	}
 
 	let numberOfUnits = Engine.GetGUIObjectByName("numberOfUnits");
 	numberOfUnits.caption = selection.length;
Index: binaries/data/mods/public/gui/session/session.js
===================================================================
--- binaries/data/mods/public/gui/session/session.js	(revision 18512)
+++ binaries/data/mods/public/gui/session/session.js	(working copy)
@@ -829,12 +829,12 @@ function createHeroTooltip(heroState, te
 {
 	return [
 		"[font=\"sans-bold-16\"]" + template.name.specific + "[/font]" + "\n" +
 			sprintf(translate("%(label)s %(current)s / %(max)s"), {
 				"label": "[font=\"sans-bold-13\"]" + translate("Health:") + "[/font]",
-				"current": Math.ceil(heroState.hitpoints),
-				"max": Math.ceil(heroState.maxHitpoints)
+				"current": Math.round(heroState.hitpoints) || 1,
+				"max": Math.round(heroState.maxHitpoints) || 1
 			}),
 		getAttackTooltip(heroState),
 		getArmorTooltip(heroState),
 		getEntityTooltip(heroState)
 	].filter(tip => tip).join("\n");
