### Godot version

v4.2.dev5.official [e3e2528ba]

### System information

Godot v4.2.dev5 - Windows 10.0.19045 - Vulkan (Forward+) - dedicated NVIDIA GeForce GTX 970 (NVIDIA; 31.0.15.3623) - Intel(R) Core(TM) i7-4790K CPU @ 4.00GHz (8 Threads)

### Issue description

#79975 closed his issue too early, it's a separate issue to #78434.

I'll just repost his same gif:
![256703477-a7db18c1-eccf-42af-85ef-1a1472f30c73](https://github.com/godotengine/godot/assets/15337628/1a7926ea-a9d8-4eb3-a857-8d34df23228f)

### Steps to reproduce

I had a theory it was related to editor settings and I tracked it down:

1. Editor -> `Display Scale` = Custom
2. Editor -> `Custom Display Scale` = 1.15
3. Click Save & Restart
4. Print stuff

```
var number := 0
func _process(delta: float) -> void:
	number += 1
	print(number)
```

The scale number matters, 1.1 seems to be fine but smaller decimal places such as 1.15 are what cause the issue.

### Minimal reproduction project

[printbug.zip](https://github.com/godotengine/godot/files/12683758/printbug.zip)

ItemTornado *item_tornado = static_cast<ItemTornado *>(item_fx);
					if (!cn) {
						double torn_x = Math::sin(item_tornado->frequency * item_tornado->elapsed_time + ((p_ofs.x + off.x) / 50)) * (item_tornado->radius);
						double torn_y = Math::cos(item_tornado->frequency * item_tornado->elapsed_time + ((p_ofs.x + off.x) / 50)) * (item_tornado->radius);
						item_tornado->prev_off = Point2(torn_x, torn_y);
					}
					fx_offset += item_tornado->prev_off;
				} else if (item_fx->type == ITEM_RAINBOW) {
					ItemRainbow *item_rainbow = static_cast<ItemRainbow *>(item_fx);
					font_color = font_color.from_hsv(item_rainbow->frequency * (item_rainbow->elapsed_time + ((p_ofs.x + off.x) / 50)), item_rainbow->saturation, item_rainbow->value, font_color.a);
				} else if (item_fx->type == ITEM_PULSE) {
					ItemPulse *item_pulse = static_cast<ItemPulse *>(item_fx);
					const float sined_time = (Math::ease(Math::pingpong(item_pulse->elapsed_time, 1.0 / item_pulse->frequency) * item_pulse->frequency, item_pulse->ease));
					font_color = font_color.lerp(font_color * item_pulse->color, sined_time);
				}
			}
			if (is_inside_tree() && get_viewport()->is_snap_2d_transforms_to_pixel_enabled()) {
				fx_offset = fx_offset.round();
			}
			Vector2 char_off = char_xform.get_origin();
			Transform2D char_reverse_xform;
			char_reverse_xform.set_origin(-char_off);
			char_xform = char_xform * char_reverse_xform;
			draw_set_transform_matrix(char_xform);
			if (selected && use_selected_font_color) {
				font_color = theme_cache.font_selected_color;
			}
			
			for (int j = 0; j < glyphs[i].repeat; j++) {
				bool skip = (trim_chars && l.char_offset + glyphs[i].end > visible_characters) || (trim_glyphs_ltr && (r_processed_glyphs >= visible_glyphs)) || (trim_glyphs_rtl && (r_processed_glyphs < total_glyphs - visible_glyphs));